{
  "cells": [
    {
      "cell_type": "code",
      "metadata": {
        "ExecuteTime": {
          "end_time": "2025-01-16T06:45:04.846335Z",
          "start_time": "2025-01-16T06:45:02.383978Z"
        },
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "FNTyjDX1V503",
        "outputId": "d3728182-1c64-4a28-a77e-bfe716f7954d"
      },
      "source": [
        "import matplotlib as mpl\n",
        "import matplotlib.pyplot as plt\n",
        "%matplotlib inline\n",
        "import numpy as np\n",
        "import sklearn\n",
        "import pandas as pd\n",
        "import os\n",
        "import sys\n",
        "import time\n",
        "from tqdm.auto import tqdm\n",
        "import torch\n",
        "import torch.nn as nn\n",
        "import torch.nn.functional as F\n",
        "\n",
        "print(sys.version_info)\n",
        "for module in mpl, np, pd, sklearn, torch:\n",
        "    print(module.__name__, module.__version__)\n",
        "\n",
        "device = torch.device(\"cuda:0\") if torch.cuda.is_available() else torch.device(\"cpu\")\n",
        "print(device)\n"
      ],
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "sys.version_info(major=3, minor=11, micro=11, releaselevel='final', serial=0)\n",
            "matplotlib 3.10.0\n",
            "numpy 1.26.4\n",
            "pandas 2.2.2\n",
            "sklearn 1.6.1\n",
            "torch 2.5.1+cu124\n",
            "cuda:0\n"
          ]
        }
      ],
      "execution_count": 2
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "UiPZlJsFV507"
      },
      "source": [
        "## 准备数据"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "ExecuteTime": {
          "end_time": "2025-01-16T06:45:04.904540Z",
          "start_time": "2025-01-16T06:45:04.846335Z"
        },
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "hMPVYTbOV508",
        "outputId": "03ab4a33-fbde-4fcc-a2ec-502d61647324"
      },
      "source": [
        "from sklearn.datasets import fetch_california_housing\n",
        "\n",
        "housing = fetch_california_housing(data_home='data')\n",
        "print(housing.DESCR)\n",
        "print(housing.data.shape)\n",
        "print(housing.target.shape)"
      ],
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            ".. _california_housing_dataset:\n",
            "\n",
            "California Housing dataset\n",
            "--------------------------\n",
            "\n",
            "**Data Set Characteristics:**\n",
            "\n",
            ":Number of Instances: 20640\n",
            "\n",
            ":Number of Attributes: 8 numeric, predictive attributes and the target\n",
            "\n",
            ":Attribute Information:\n",
            "    - MedInc        median income in block group\n",
            "    - HouseAge      median house age in block group\n",
            "    - AveRooms      average number of rooms per household\n",
            "    - AveBedrms     average number of bedrooms per household\n",
            "    - Population    block group population\n",
            "    - AveOccup      average number of household members\n",
            "    - Latitude      block group latitude\n",
            "    - Longitude     block group longitude\n",
            "\n",
            ":Missing Attribute Values: None\n",
            "\n",
            "This dataset was obtained from the StatLib repository.\n",
            "https://www.dcc.fc.up.pt/~ltorgo/Regression/cal_housing.html\n",
            "\n",
            "The target variable is the median house value for California districts,\n",
            "expressed in hundreds of thousands of dollars ($100,000).\n",
            "\n",
            "This dataset was derived from the 1990 U.S. census, using one row per census\n",
            "block group. A block group is the smallest geographical unit for which the U.S.\n",
            "Census Bureau publishes sample data (a block group typically has a population\n",
            "of 600 to 3,000 people).\n",
            "\n",
            "A household is a group of people residing within a home. Since the average\n",
            "number of rooms and bedrooms in this dataset are provided per household, these\n",
            "columns may take surprisingly large values for block groups with few households\n",
            "and many empty houses, such as vacation resorts.\n",
            "\n",
            "It can be downloaded/loaded using the\n",
            ":func:`sklearn.datasets.fetch_california_housing` function.\n",
            "\n",
            ".. rubric:: References\n",
            "\n",
            "- Pace, R. Kelley and Ronald Barry, Sparse Spatial Autoregressions,\n",
            "  Statistics and Probability Letters, 33 (1997) 291-297\n",
            "\n",
            "(20640, 8)\n",
            "(20640,)\n"
          ]
        }
      ],
      "execution_count": 3
    },
    {
      "cell_type": "code",
      "metadata": {
        "ExecuteTime": {
          "end_time": "2025-01-16T06:45:04.907863Z",
          "start_time": "2025-01-16T06:45:04.904540Z"
        },
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "hJixnbb2V508",
        "outputId": "1e786cb9-24ad-41d8-9ec1-cecb391acab2"
      },
      "source": [
        "# print(housing.data[0:5])\n",
        "import pprint  #打印的格式比较 好看\n",
        "\n",
        "pprint.pprint(housing.data[0:2])\n",
        "print('-'*50)\n",
        "pprint.pprint(housing.target[0:2])"
      ],
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "array([[ 8.32520000e+00,  4.10000000e+01,  6.98412698e+00,\n",
            "         1.02380952e+00,  3.22000000e+02,  2.55555556e+00,\n",
            "         3.78800000e+01, -1.22230000e+02],\n",
            "       [ 8.30140000e+00,  2.10000000e+01,  6.23813708e+00,\n",
            "         9.71880492e-01,  2.40100000e+03,  2.10984183e+00,\n",
            "         3.78600000e+01, -1.22220000e+02]])\n",
            "--------------------------------------------------\n",
            "array([4.526, 3.585])\n"
          ]
        }
      ],
      "execution_count": 4
    },
    {
      "cell_type": "code",
      "metadata": {
        "ExecuteTime": {
          "end_time": "2025-01-16T06:45:04.942931Z",
          "start_time": "2025-01-16T06:45:04.907863Z"
        },
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "pulbkBTKV509",
        "outputId": "bed2dd4f-37a5-4dfe-9e81-292b8fefc490"
      },
      "source": [
        "from sklearn.model_selection import train_test_split\n",
        "\n",
        "#拆分训练集和测试集，random_state是随机种子,同样的随机数种子，是为了得到同样的随机值\n",
        "x_train_all, x_test, y_train_all, y_test = train_test_split(\n",
        "    housing.data, housing.target, random_state = 7)\n",
        "x_train, x_valid, y_train, y_valid = train_test_split(\n",
        "    x_train_all, y_train_all, random_state = 11)\n",
        "# 训练集\n",
        "print(x_train.shape, y_train.shape)\n",
        "# 验证集\n",
        "print(x_valid.shape, y_valid.shape)\n",
        "# 测试集\n",
        "print(x_test.shape, y_test.shape)\n",
        "\n",
        "dataset_maps = {\n",
        "    \"train\": [x_train, y_train], #训练集\n",
        "    \"valid\": [x_valid, y_valid], #验证集\n",
        "    \"test\": [x_test, y_test], #测试集\n",
        "} #把3个数据集都放到字典中\n"
      ],
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "(11610, 8) (11610,)\n",
            "(3870, 8) (3870,)\n",
            "(5160, 8) (5160,)\n"
          ]
        }
      ],
      "execution_count": 5
    },
    {
      "cell_type": "code",
      "source": [
        "type(x_train)"
      ],
      "metadata": {
        "ExecuteTime": {
          "end_time": "2025-01-16T06:45:04.946957Z",
          "start_time": "2025-01-16T06:45:04.943934Z"
        },
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "tnziSQUwV509",
        "outputId": "8feb2eec-0d1c-4ab6-d93b-f34bf18fa097"
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "numpy.ndarray"
            ]
          },
          "metadata": {},
          "execution_count": 6
        }
      ],
      "execution_count": 6
    },
    {
      "cell_type": "code",
      "metadata": {
        "ExecuteTime": {
          "end_time": "2025-01-16T06:45:04.952973Z",
          "start_time": "2025-01-16T06:45:04.946957Z"
        },
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 80
        },
        "id": "T4NWvjDzV50-",
        "outputId": "4000efde-64bd-4f43-c1ac-f51b501001a5"
      },
      "source": [
        "from sklearn.preprocessing import StandardScaler\n",
        "\n",
        "\n",
        "\n",
        "scaler = StandardScaler() #标准化\n",
        "scaler.fit(x_train) #fit和fit_transform的区别，fit是计算均值和方差，fit_transform是先fit，然后transform"
      ],
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "StandardScaler()"
            ],
            "text/html": [
              "<style>#sk-container-id-1 {\n",
              "  /* Definition of color scheme common for light and dark mode */\n",
              "  --sklearn-color-text: #000;\n",
              "  --sklearn-color-text-muted: #666;\n",
              "  --sklearn-color-line: gray;\n",
              "  /* Definition of color scheme for unfitted estimators */\n",
              "  --sklearn-color-unfitted-level-0: #fff5e6;\n",
              "  --sklearn-color-unfitted-level-1: #f6e4d2;\n",
              "  --sklearn-color-unfitted-level-2: #ffe0b3;\n",
              "  --sklearn-color-unfitted-level-3: chocolate;\n",
              "  /* Definition of color scheme for fitted estimators */\n",
              "  --sklearn-color-fitted-level-0: #f0f8ff;\n",
              "  --sklearn-color-fitted-level-1: #d4ebff;\n",
              "  --sklearn-color-fitted-level-2: #b3dbfd;\n",
              "  --sklearn-color-fitted-level-3: cornflowerblue;\n",
              "\n",
              "  /* Specific color for light theme */\n",
              "  --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
              "  --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n",
              "  --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
              "  --sklearn-color-icon: #696969;\n",
              "\n",
              "  @media (prefers-color-scheme: dark) {\n",
              "    /* Redefinition of color scheme for dark theme */\n",
              "    --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
              "    --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n",
              "    --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
              "    --sklearn-color-icon: #878787;\n",
              "  }\n",
              "}\n",
              "\n",
              "#sk-container-id-1 {\n",
              "  color: var(--sklearn-color-text);\n",
              "}\n",
              "\n",
              "#sk-container-id-1 pre {\n",
              "  padding: 0;\n",
              "}\n",
              "\n",
              "#sk-container-id-1 input.sk-hidden--visually {\n",
              "  border: 0;\n",
              "  clip: rect(1px 1px 1px 1px);\n",
              "  clip: rect(1px, 1px, 1px, 1px);\n",
              "  height: 1px;\n",
              "  margin: -1px;\n",
              "  overflow: hidden;\n",
              "  padding: 0;\n",
              "  position: absolute;\n",
              "  width: 1px;\n",
              "}\n",
              "\n",
              "#sk-container-id-1 div.sk-dashed-wrapped {\n",
              "  border: 1px dashed var(--sklearn-color-line);\n",
              "  margin: 0 0.4em 0.5em 0.4em;\n",
              "  box-sizing: border-box;\n",
              "  padding-bottom: 0.4em;\n",
              "  background-color: var(--sklearn-color-background);\n",
              "}\n",
              "\n",
              "#sk-container-id-1 div.sk-container {\n",
              "  /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
              "     but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
              "     so we also need the `!important` here to be able to override the\n",
              "     default hidden behavior on the sphinx rendered scikit-learn.org.\n",
              "     See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
              "  display: inline-block !important;\n",
              "  position: relative;\n",
              "}\n",
              "\n",
              "#sk-container-id-1 div.sk-text-repr-fallback {\n",
              "  display: none;\n",
              "}\n",
              "\n",
              "div.sk-parallel-item,\n",
              "div.sk-serial,\n",
              "div.sk-item {\n",
              "  /* draw centered vertical line to link estimators */\n",
              "  background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
              "  background-size: 2px 100%;\n",
              "  background-repeat: no-repeat;\n",
              "  background-position: center center;\n",
              "}\n",
              "\n",
              "/* Parallel-specific style estimator block */\n",
              "\n",
              "#sk-container-id-1 div.sk-parallel-item::after {\n",
              "  content: \"\";\n",
              "  width: 100%;\n",
              "  border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
              "  flex-grow: 1;\n",
              "}\n",
              "\n",
              "#sk-container-id-1 div.sk-parallel {\n",
              "  display: flex;\n",
              "  align-items: stretch;\n",
              "  justify-content: center;\n",
              "  background-color: var(--sklearn-color-background);\n",
              "  position: relative;\n",
              "}\n",
              "\n",
              "#sk-container-id-1 div.sk-parallel-item {\n",
              "  display: flex;\n",
              "  flex-direction: column;\n",
              "}\n",
              "\n",
              "#sk-container-id-1 div.sk-parallel-item:first-child::after {\n",
              "  align-self: flex-end;\n",
              "  width: 50%;\n",
              "}\n",
              "\n",
              "#sk-container-id-1 div.sk-parallel-item:last-child::after {\n",
              "  align-self: flex-start;\n",
              "  width: 50%;\n",
              "}\n",
              "\n",
              "#sk-container-id-1 div.sk-parallel-item:only-child::after {\n",
              "  width: 0;\n",
              "}\n",
              "\n",
              "/* Serial-specific style estimator block */\n",
              "\n",
              "#sk-container-id-1 div.sk-serial {\n",
              "  display: flex;\n",
              "  flex-direction: column;\n",
              "  align-items: center;\n",
              "  background-color: var(--sklearn-color-background);\n",
              "  padding-right: 1em;\n",
              "  padding-left: 1em;\n",
              "}\n",
              "\n",
              "\n",
              "/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
              "clickable and can be expanded/collapsed.\n",
              "- Pipeline and ColumnTransformer use this feature and define the default style\n",
              "- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
              "*/\n",
              "\n",
              "/* Pipeline and ColumnTransformer style (default) */\n",
              "\n",
              "#sk-container-id-1 div.sk-toggleable {\n",
              "  /* Default theme specific background. It is overwritten whether we have a\n",
              "  specific estimator or a Pipeline/ColumnTransformer */\n",
              "  background-color: var(--sklearn-color-background);\n",
              "}\n",
              "\n",
              "/* Toggleable label */\n",
              "#sk-container-id-1 label.sk-toggleable__label {\n",
              "  cursor: pointer;\n",
              "  display: flex;\n",
              "  width: 100%;\n",
              "  margin-bottom: 0;\n",
              "  padding: 0.5em;\n",
              "  box-sizing: border-box;\n",
              "  text-align: center;\n",
              "  align-items: start;\n",
              "  justify-content: space-between;\n",
              "  gap: 0.5em;\n",
              "}\n",
              "\n",
              "#sk-container-id-1 label.sk-toggleable__label .caption {\n",
              "  font-size: 0.6rem;\n",
              "  font-weight: lighter;\n",
              "  color: var(--sklearn-color-text-muted);\n",
              "}\n",
              "\n",
              "#sk-container-id-1 label.sk-toggleable__label-arrow:before {\n",
              "  /* Arrow on the left of the label */\n",
              "  content: \"▸\";\n",
              "  float: left;\n",
              "  margin-right: 0.25em;\n",
              "  color: var(--sklearn-color-icon);\n",
              "}\n",
              "\n",
              "#sk-container-id-1 label.sk-toggleable__label-arrow:hover:before {\n",
              "  color: var(--sklearn-color-text);\n",
              "}\n",
              "\n",
              "/* Toggleable content - dropdown */\n",
              "\n",
              "#sk-container-id-1 div.sk-toggleable__content {\n",
              "  max-height: 0;\n",
              "  max-width: 0;\n",
              "  overflow: hidden;\n",
              "  text-align: left;\n",
              "  /* unfitted */\n",
              "  background-color: var(--sklearn-color-unfitted-level-0);\n",
              "}\n",
              "\n",
              "#sk-container-id-1 div.sk-toggleable__content.fitted {\n",
              "  /* fitted */\n",
              "  background-color: var(--sklearn-color-fitted-level-0);\n",
              "}\n",
              "\n",
              "#sk-container-id-1 div.sk-toggleable__content pre {\n",
              "  margin: 0.2em;\n",
              "  border-radius: 0.25em;\n",
              "  color: var(--sklearn-color-text);\n",
              "  /* unfitted */\n",
              "  background-color: var(--sklearn-color-unfitted-level-0);\n",
              "}\n",
              "\n",
              "#sk-container-id-1 div.sk-toggleable__content.fitted pre {\n",
              "  /* unfitted */\n",
              "  background-color: var(--sklearn-color-fitted-level-0);\n",
              "}\n",
              "\n",
              "#sk-container-id-1 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
              "  /* Expand drop-down */\n",
              "  max-height: 200px;\n",
              "  max-width: 100%;\n",
              "  overflow: auto;\n",
              "}\n",
              "\n",
              "#sk-container-id-1 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
              "  content: \"▾\";\n",
              "}\n",
              "\n",
              "/* Pipeline/ColumnTransformer-specific style */\n",
              "\n",
              "#sk-container-id-1 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
              "  color: var(--sklearn-color-text);\n",
              "  background-color: var(--sklearn-color-unfitted-level-2);\n",
              "}\n",
              "\n",
              "#sk-container-id-1 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
              "  background-color: var(--sklearn-color-fitted-level-2);\n",
              "}\n",
              "\n",
              "/* Estimator-specific style */\n",
              "\n",
              "/* Colorize estimator box */\n",
              "#sk-container-id-1 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
              "  /* unfitted */\n",
              "  background-color: var(--sklearn-color-unfitted-level-2);\n",
              "}\n",
              "\n",
              "#sk-container-id-1 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
              "  /* fitted */\n",
              "  background-color: var(--sklearn-color-fitted-level-2);\n",
              "}\n",
              "\n",
              "#sk-container-id-1 div.sk-label label.sk-toggleable__label,\n",
              "#sk-container-id-1 div.sk-label label {\n",
              "  /* The background is the default theme color */\n",
              "  color: var(--sklearn-color-text-on-default-background);\n",
              "}\n",
              "\n",
              "/* On hover, darken the color of the background */\n",
              "#sk-container-id-1 div.sk-label:hover label.sk-toggleable__label {\n",
              "  color: var(--sklearn-color-text);\n",
              "  background-color: var(--sklearn-color-unfitted-level-2);\n",
              "}\n",
              "\n",
              "/* Label box, darken color on hover, fitted */\n",
              "#sk-container-id-1 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
              "  color: var(--sklearn-color-text);\n",
              "  background-color: var(--sklearn-color-fitted-level-2);\n",
              "}\n",
              "\n",
              "/* Estimator label */\n",
              "\n",
              "#sk-container-id-1 div.sk-label label {\n",
              "  font-family: monospace;\n",
              "  font-weight: bold;\n",
              "  display: inline-block;\n",
              "  line-height: 1.2em;\n",
              "}\n",
              "\n",
              "#sk-container-id-1 div.sk-label-container {\n",
              "  text-align: center;\n",
              "}\n",
              "\n",
              "/* Estimator-specific */\n",
              "#sk-container-id-1 div.sk-estimator {\n",
              "  font-family: monospace;\n",
              "  border: 1px dotted var(--sklearn-color-border-box);\n",
              "  border-radius: 0.25em;\n",
              "  box-sizing: border-box;\n",
              "  margin-bottom: 0.5em;\n",
              "  /* unfitted */\n",
              "  background-color: var(--sklearn-color-unfitted-level-0);\n",
              "}\n",
              "\n",
              "#sk-container-id-1 div.sk-estimator.fitted {\n",
              "  /* fitted */\n",
              "  background-color: var(--sklearn-color-fitted-level-0);\n",
              "}\n",
              "\n",
              "/* on hover */\n",
              "#sk-container-id-1 div.sk-estimator:hover {\n",
              "  /* unfitted */\n",
              "  background-color: var(--sklearn-color-unfitted-level-2);\n",
              "}\n",
              "\n",
              "#sk-container-id-1 div.sk-estimator.fitted:hover {\n",
              "  /* fitted */\n",
              "  background-color: var(--sklearn-color-fitted-level-2);\n",
              "}\n",
              "\n",
              "/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
              "\n",
              "/* Common style for \"i\" and \"?\" */\n",
              "\n",
              ".sk-estimator-doc-link,\n",
              "a:link.sk-estimator-doc-link,\n",
              "a:visited.sk-estimator-doc-link {\n",
              "  float: right;\n",
              "  font-size: smaller;\n",
              "  line-height: 1em;\n",
              "  font-family: monospace;\n",
              "  background-color: var(--sklearn-color-background);\n",
              "  border-radius: 1em;\n",
              "  height: 1em;\n",
              "  width: 1em;\n",
              "  text-decoration: none !important;\n",
              "  margin-left: 0.5em;\n",
              "  text-align: center;\n",
              "  /* unfitted */\n",
              "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
              "  color: var(--sklearn-color-unfitted-level-1);\n",
              "}\n",
              "\n",
              ".sk-estimator-doc-link.fitted,\n",
              "a:link.sk-estimator-doc-link.fitted,\n",
              "a:visited.sk-estimator-doc-link.fitted {\n",
              "  /* fitted */\n",
              "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
              "  color: var(--sklearn-color-fitted-level-1);\n",
              "}\n",
              "\n",
              "/* On hover */\n",
              "div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
              ".sk-estimator-doc-link:hover,\n",
              "div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
              ".sk-estimator-doc-link:hover {\n",
              "  /* unfitted */\n",
              "  background-color: var(--sklearn-color-unfitted-level-3);\n",
              "  color: var(--sklearn-color-background);\n",
              "  text-decoration: none;\n",
              "}\n",
              "\n",
              "div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
              ".sk-estimator-doc-link.fitted:hover,\n",
              "div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
              ".sk-estimator-doc-link.fitted:hover {\n",
              "  /* fitted */\n",
              "  background-color: var(--sklearn-color-fitted-level-3);\n",
              "  color: var(--sklearn-color-background);\n",
              "  text-decoration: none;\n",
              "}\n",
              "\n",
              "/* Span, style for the box shown on hovering the info icon */\n",
              ".sk-estimator-doc-link span {\n",
              "  display: none;\n",
              "  z-index: 9999;\n",
              "  position: relative;\n",
              "  font-weight: normal;\n",
              "  right: .2ex;\n",
              "  padding: .5ex;\n",
              "  margin: .5ex;\n",
              "  width: min-content;\n",
              "  min-width: 20ex;\n",
              "  max-width: 50ex;\n",
              "  color: var(--sklearn-color-text);\n",
              "  box-shadow: 2pt 2pt 4pt #999;\n",
              "  /* unfitted */\n",
              "  background: var(--sklearn-color-unfitted-level-0);\n",
              "  border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
              "}\n",
              "\n",
              ".sk-estimator-doc-link.fitted span {\n",
              "  /* fitted */\n",
              "  background: var(--sklearn-color-fitted-level-0);\n",
              "  border: var(--sklearn-color-fitted-level-3);\n",
              "}\n",
              "\n",
              ".sk-estimator-doc-link:hover span {\n",
              "  display: block;\n",
              "}\n",
              "\n",
              "/* \"?\"-specific style due to the `<a>` HTML tag */\n",
              "\n",
              "#sk-container-id-1 a.estimator_doc_link {\n",
              "  float: right;\n",
              "  font-size: 1rem;\n",
              "  line-height: 1em;\n",
              "  font-family: monospace;\n",
              "  background-color: var(--sklearn-color-background);\n",
              "  border-radius: 1rem;\n",
              "  height: 1rem;\n",
              "  width: 1rem;\n",
              "  text-decoration: none;\n",
              "  /* unfitted */\n",
              "  color: var(--sklearn-color-unfitted-level-1);\n",
              "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
              "}\n",
              "\n",
              "#sk-container-id-1 a.estimator_doc_link.fitted {\n",
              "  /* fitted */\n",
              "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
              "  color: var(--sklearn-color-fitted-level-1);\n",
              "}\n",
              "\n",
              "/* On hover */\n",
              "#sk-container-id-1 a.estimator_doc_link:hover {\n",
              "  /* unfitted */\n",
              "  background-color: var(--sklearn-color-unfitted-level-3);\n",
              "  color: var(--sklearn-color-background);\n",
              "  text-decoration: none;\n",
              "}\n",
              "\n",
              "#sk-container-id-1 a.estimator_doc_link.fitted:hover {\n",
              "  /* fitted */\n",
              "  background-color: var(--sklearn-color-fitted-level-3);\n",
              "}\n",
              "</style><div id=\"sk-container-id-1\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>StandardScaler()</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-1\" type=\"checkbox\" checked><label for=\"sk-estimator-id-1\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow\"><div><div>StandardScaler</div></div><div><a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.6/modules/generated/sklearn.preprocessing.StandardScaler.html\">?<span>Documentation for StandardScaler</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></div></label><div class=\"sk-toggleable__content fitted\"><pre>StandardScaler()</pre></div> </div></div></div></div>"
            ]
          },
          "metadata": {},
          "execution_count": 7
        }
      ],
      "execution_count": 7
    },
    {
      "cell_type": "code",
      "source": [
        "np.array(1).shape"
      ],
      "metadata": {
        "ExecuteTime": {
          "end_time": "2025-01-16T06:45:04.956326Z",
          "start_time": "2025-01-16T06:45:04.952973Z"
        },
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "4-lQmuwOV50-",
        "outputId": "892cd474-6df9-4f27-be8a-fa5893fe71c6"
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "()"
            ]
          },
          "metadata": {},
          "execution_count": 8
        }
      ],
      "execution_count": 8
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "FnLIwQzPV50_"
      },
      "source": [
        "### 构建数据集"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "ExecuteTime": {
          "end_time": "2025-01-16T06:45:04.963803Z",
          "start_time": "2025-01-16T06:45:04.956326Z"
        },
        "id": "1u5DgzzLV50_"
      },
      "source": [
        "#构建私有数据集，就需要用如下方式\n",
        "from torch.utils.data import Dataset\n",
        "\n",
        "class HousingDataset(Dataset):\n",
        "    def __init__(self, mode='train'):\n",
        "        self.x, self.y = dataset_maps[mode] #x,y都是ndarray类型\n",
        "        self.x = torch.from_numpy(scaler.transform(self.x)).float() #from_numpy将NumPy数组转换成PyTorch张量\n",
        "        self.y = torch.from_numpy(self.y).float().reshape(-1, 1) #处理为多行1列的tensor类型,因为__getitem__切片时需要\n",
        "\n",
        "    def __len__(self): #必须写\n",
        "        return len(self.x) #返回数据集的长度,0维的size\n",
        "\n",
        "    def __getitem__(self, idx): #idx是索引，返回的是数据和标签，这里是一个样本\n",
        "        return self.x[idx], self.y[idx]\n",
        "\n",
        "#train_ds是dataset类型的数据，与前面例子的FashionMNIST类型一致\n",
        "train_ds = HousingDataset(\"train\")\n",
        "valid_ds = HousingDataset(\"valid\")\n",
        "test_ds = HousingDataset(\"test\")"
      ],
      "outputs": [],
      "execution_count": 9
    },
    {
      "metadata": {
        "ExecuteTime": {
          "end_time": "2025-01-16T06:45:04.966801Z",
          "start_time": "2025-01-16T06:45:04.963803Z"
        },
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 187
        },
        "id": "Xhf3Z--WV50_",
        "outputId": "7cd39760-7773-487c-b5a8-b3a49d40c866"
      },
      "cell_type": "code",
      "source": [
        "type(train_ds)"
      ],
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "__main__.HousingDataset"
            ],
            "text/html": [
              "<div style=\"max-width:800px; border: 1px solid var(--colab-border-color);\"><style>\n",
              "      pre.function-repr-contents {\n",
              "        overflow-x: auto;\n",
              "        padding: 8px 12px;\n",
              "        max-height: 500px;\n",
              "      }\n",
              "\n",
              "      pre.function-repr-contents.function-repr-contents-collapsed {\n",
              "        cursor: pointer;\n",
              "        max-height: 100px;\n",
              "      }\n",
              "    </style>\n",
              "    <pre style=\"white-space: initial; background:\n",
              "         var(--colab-secondary-surface-color); padding: 8px 12px;\n",
              "         border-bottom: 1px solid var(--colab-border-color);\"><b>HousingDataset</b><br/>def __init__(mode=&#x27;train&#x27;)</pre><pre class=\"function-repr-contents function-repr-contents-collapsed\" style=\"\"><a class=\"filepath\" style=\"display:none\" href=\"#\"></a>An abstract class representing a :class:`Dataset`.\n",
              "\n",
              "All datasets that represent a map from keys to data samples should subclass\n",
              "it. All subclasses should overwrite :meth:`__getitem__`, supporting fetching a\n",
              "data sample for a given key. Subclasses could also optionally overwrite\n",
              ":meth:`__len__`, which is expected to return the size of the dataset by many\n",
              ":class:`~torch.utils.data.Sampler` implementations and the default options\n",
              "of :class:`~torch.utils.data.DataLoader`. Subclasses could also\n",
              "optionally implement :meth:`__getitems__`, for speedup batched samples\n",
              "loading. This method accepts list of indices of samples of batch and returns\n",
              "list of samples.\n",
              "\n",
              ".. note::\n",
              "  :class:`~torch.utils.data.DataLoader` by default constructs an index\n",
              "  sampler that yields integral indices.  To make it work with a map-style\n",
              "  dataset with non-integral indices/keys, a custom sampler must be provided.</pre></div>"
            ]
          },
          "metadata": {},
          "execution_count": 10
        }
      ],
      "execution_count": 10
    },
    {
      "cell_type": "code",
      "metadata": {
        "ExecuteTime": {
          "end_time": "2025-01-16T06:45:04.972403Z",
          "start_time": "2025-01-16T06:45:04.966801Z"
        },
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "n2iGoc_SV50_",
        "outputId": "4addc1fd-65b0-4534-acb2-71b63ae28dcb"
      },
      "source": [
        "train_ds[1]"
      ],
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "(tensor([-0.2981,  0.3523, -0.1092, -0.2506, -0.0341, -0.0060,  1.0806, -1.0611]),\n",
              " tensor([1.5140]))"
            ]
          },
          "metadata": {},
          "execution_count": 11
        }
      ],
      "execution_count": 11
    },
    {
      "cell_type": "code",
      "source": [
        "train_ds[0][0]"
      ],
      "metadata": {
        "ExecuteTime": {
          "end_time": "2025-01-16T06:45:04.975745Z",
          "start_time": "2025-01-16T06:45:04.972403Z"
        },
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "UX6rZ_etV50_",
        "outputId": "3ebbb38e-f5f4-45c9-eca3-29ce66faeca9"
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "tensor([ 0.8015,  0.2722, -0.1162, -0.2023, -0.5431, -0.0210, -0.5898, -0.0824])"
            ]
          },
          "metadata": {},
          "execution_count": 12
        }
      ],
      "execution_count": 12
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "N5UfTqUIV51A"
      },
      "source": [
        "### DataLoader"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "ExecuteTime": {
          "end_time": "2025-01-16T06:45:04.979156Z",
          "start_time": "2025-01-16T06:45:04.976749Z"
        },
        "id": "dWlhwdAwV51A"
      },
      "source": [
        "from torch.utils.data import DataLoader\n",
        "\n",
        "#放到DataLoader中的train_ds, valid_ds, test_ds都是dataset类型的数据\n",
        "batch_size = 16 #batch_size是可以调的超参数\n",
        "train_loader = DataLoader(train_ds, batch_size=batch_size, shuffle=True)\n",
        "val_loader = DataLoader(valid_ds, batch_size=batch_size, shuffle=False)\n",
        "test_loader = DataLoader(test_ds, batch_size=batch_size, shuffle=False)"
      ],
      "outputs": [],
      "execution_count": 13
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "0NjDkSFgV51A"
      },
      "source": [
        "## 定义模型"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "ExecuteTime": {
          "end_time": "2025-01-16T06:45:04.981959Z",
          "start_time": "2025-01-16T06:45:04.979156Z"
        },
        "id": "rOm8oXx6V51A"
      },
      "source": [
        "#回归模型我们只需要1个数\n",
        "\n",
        "class NeuralNetwork(nn.Module):\n",
        "    def __init__(self, input_dim=8):\n",
        "        super().__init__()\n",
        "        self.linear_relu_stack = nn.Sequential(\n",
        "            nn.Linear(input_dim, 30),\n",
        "            nn.ReLU(),\n",
        "            nn.Linear(30, 1)\n",
        "            )\n",
        "\n",
        "    def forward(self, x):\n",
        "        # x.shape [batch size, 8]\n",
        "        logits = self.linear_relu_stack(x)\n",
        "        # logits.shape [batch size, 1]\n",
        "        return logits"
      ],
      "outputs": [],
      "execution_count": 14
    },
    {
      "metadata": {
        "ExecuteTime": {
          "end_time": "2025-01-16T06:45:04.985779Z",
          "start_time": "2025-01-16T06:45:04.982963Z"
        },
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "6SUsoNdWV51A",
        "outputId": "bea57c51-6430-4d3c-854f-0f18f2ba0fa6"
      },
      "cell_type": "code",
      "source": [
        "8*30+30+30*1+1"
      ],
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "301"
            ]
          },
          "metadata": {},
          "execution_count": 15
        }
      ],
      "execution_count": 15
    },
    {
      "cell_type": "code",
      "metadata": {
        "ExecuteTime": {
          "end_time": "2025-01-16T06:45:04.988940Z",
          "start_time": "2025-01-16T06:45:04.985779Z"
        },
        "id": "VPNtZji7V51A"
      },
      "source": [
        "class EarlyStopCallback:\n",
        "    def __init__(self, patience=5, min_delta=0.01):\n",
        "        \"\"\"\n",
        "\n",
        "        Args:\n",
        "            patience (int, optional): Number of epochs with no improvement after which training will be stopped.. Defaults to 5.\n",
        "            min_delta (float, optional): Minimum change in the monitored quantity to qualify as an improvement, i.e. an absolute\n",
        "                change of less than min_delta, will count as no improvement. Defaults to 0.01.\n",
        "        \"\"\"\n",
        "        self.patience = patience\n",
        "        self.min_delta = min_delta\n",
        "        self.best_metric = -1\n",
        "        self.counter = 0\n",
        "\n",
        "    def __call__(self, metric):\n",
        "        if metric >= self.best_metric + self.min_delta:\n",
        "            # update best metric\n",
        "            self.best_metric = metric\n",
        "            # reset counter\n",
        "            self.counter = 0\n",
        "        else:\n",
        "            self.counter += 1\n",
        "\n",
        "    @property\n",
        "    def early_stop(self):\n",
        "        return self.counter >= self.patience\n"
      ],
      "outputs": [],
      "execution_count": 16
    },
    {
      "cell_type": "code",
      "metadata": {
        "ExecuteTime": {
          "end_time": "2025-01-16T06:45:04.991952Z",
          "start_time": "2025-01-16T06:45:04.988940Z"
        },
        "id": "Ls2uMplGV51B"
      },
      "source": [
        "from sklearn.metrics import accuracy_score\n",
        "\n",
        "@torch.no_grad()\n",
        "def evaluating(model, dataloader, loss_fct):\n",
        "    loss_list = []\n",
        "    for datas, labels in dataloader:\n",
        "        datas = datas.to(device)\n",
        "        labels = labels.to(device)\n",
        "        # 前向计算\n",
        "        logits = model(datas)\n",
        "        loss = loss_fct(logits, labels)         # 验证集损失\n",
        "        loss_list.append(loss.item())\n",
        "\n",
        "    return np.mean(loss_list)\n"
      ],
      "outputs": [],
      "execution_count": 17
    },
    {
      "cell_type": "code",
      "metadata": {
        "ExecuteTime": {
          "end_time": "2025-01-16T06:46:35.958615Z",
          "start_time": "2025-01-16T06:45:47.596197Z"
        },
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 66,
          "referenced_widgets": [
            "5487adfe2726479ba756489251109c5d",
            "cd866417f5de463eaf2e9a227313ab11",
            "f22eba4c5ff049888febb22e559d9e9a",
            "14974ff782104093959e6a7900e18904",
            "7b3002ee7c744d65aeffaacde61d9ab8",
            "0fda42700ad64823912eb8503664e9a8",
            "575b8b6c08be476684ea0475908dd5f1",
            "4269008916704a59b2061d0780038e29",
            "79643440aaf148aa851a6af5c2c11901",
            "7270709e7d20417fa9cdff57833d7f56",
            "7182f0b1925044df97c5961298afcbbd"
          ]
        },
        "id": "sNwYCBWrV51B",
        "outputId": "db11ee75-a860-4cd2-aca8-687918cf6c60"
      },
      "source": [
        "# 训练\n",
        "def training(\n",
        "    model,\n",
        "    train_loader,\n",
        "    val_loader,\n",
        "    epoch,\n",
        "    loss_fct,\n",
        "    optimizer,\n",
        "    early_stop_callback=None,\n",
        "    eval_step=500,\n",
        "    ):\n",
        "    record_dict = {\n",
        "        \"train\": [],\n",
        "        \"val\": []\n",
        "    }\n",
        "\n",
        "    global_step = 0\n",
        "    model.train()\n",
        "    with tqdm(total=epoch * len(train_loader)) as pbar:\n",
        "        for epoch_id in range(epoch):\n",
        "            # training\n",
        "            for datas, labels in train_loader:#11610/16=726\n",
        "                datas = datas.to(device)\n",
        "                labels = labels.to(device)\n",
        "                # 梯度清空\n",
        "                optimizer.zero_grad()\n",
        "                # 模型前向计算\n",
        "                logits = model(datas) #得到预测值\n",
        "                # 计算损失\n",
        "                loss = loss_fct(logits, labels)\n",
        "                # 梯度回传\n",
        "                loss.backward()\n",
        "                # 调整优化器，包括学习率的变动等\n",
        "                optimizer.step()\n",
        "\n",
        "                loss = loss.cpu().item() #转为cpu类型，item()是取值\n",
        "                # record\n",
        "\n",
        "                record_dict[\"train\"].append({\n",
        "                    \"loss\": loss, \"step\": global_step\n",
        "                })\n",
        "\n",
        "                # evaluating\n",
        "                if global_step % eval_step == 0:\n",
        "                    model.eval()\n",
        "                    val_loss = evaluating(model, val_loader, loss_fct)\n",
        "                    record_dict[\"val\"].append({\n",
        "                        \"loss\": val_loss, \"step\": global_step\n",
        "                    })\n",
        "                    model.train()\n",
        "\n",
        "                    # 早停 Early Stop\n",
        "                    if early_stop_callback is not None:\n",
        "                        early_stop_callback(-val_loss) #根据验证集的损失来实现早停\n",
        "                        if early_stop_callback.early_stop:\n",
        "                            print(f\"Early stop at epoch {epoch_id} / global_step {global_step}\")\n",
        "                            return record_dict\n",
        "\n",
        "                # udate step\n",
        "                global_step += 1\n",
        "                pbar.update(1)\n",
        "                pbar.set_postfix({\"epoch\": epoch_id})\n",
        "\n",
        "    return record_dict\n",
        "\n",
        "\n",
        "epoch = 100\n",
        "\n",
        "model = NeuralNetwork()\n",
        "\n",
        "# 1. 定义损失函数 采用MSE损失,均方误差\n",
        "loss_fct = nn.MSELoss()\n",
        "# 2. 定义优化器 采用SGD\n",
        "# Optimizers specified in the torch.optim package\n",
        "optimizer = torch.optim.SGD(model.parameters(), lr=0.001, momentum=0.9)\n",
        "\n",
        "# 3. early stop\n",
        "early_stop_callback = EarlyStopCallback(patience=10, min_delta=1e-3)\n",
        "\n",
        "model = model.to(device)\n",
        "record = training(\n",
        "    model,\n",
        "    train_loader,\n",
        "    val_loader,\n",
        "    epoch,\n",
        "    loss_fct,\n",
        "    optimizer,\n",
        "    early_stop_callback=early_stop_callback,\n",
        "    eval_step=len(train_loader)\n",
        "    )"
      ],
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "  0%|          | 0/72600 [00:00<?, ?it/s]"
            ],
            "application/vnd.jupyter.widget-view+json": {
              "version_major": 2,
              "version_minor": 0,
              "model_id": "5487adfe2726479ba756489251109c5d"
            }
          },
          "metadata": {}
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Early stop at epoch 56 / global_step 40656\n"
          ]
        }
      ],
      "execution_count": 18
    },
    {
      "cell_type": "code",
      "execution_count": 19,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "{'train': [{'loss': 4.651025295257568, 'step': 0},\n",
              "  {'loss': 2.9175920486450195, 'step': 1},\n",
              "  {'loss': 7.133415699005127, 'step': 2},\n",
              "  {'loss': 4.464530944824219, 'step': 3},\n",
              "  {'loss': 3.256782054901123, 'step': 4},\n",
              "  {'loss': 2.1534860134124756, 'step': 5},\n",
              "  {'loss': 5.35834264755249, 'step': 6},\n",
              "  {'loss': 6.417240142822266, 'step': 7},\n",
              "  {'loss': 2.758571147918701, 'step': 8},\n",
              "  {'loss': 2.4174511432647705, 'step': 9},\n",
              "  {'loss': 3.2304537296295166, 'step': 10},\n",
              "  {'loss': 3.5184831619262695, 'step': 11},\n",
              "  {'loss': 2.2128055095672607, 'step': 12},\n",
              "  {'loss': 3.589144706726074, 'step': 13},\n",
              "  {'loss': 3.3134031295776367, 'step': 14},\n",
              "  {'loss': 0.7219884395599365, 'step': 15},\n",
              "  {'loss': 1.6159532070159912, 'step': 16},\n",
              "  {'loss': 2.42648983001709, 'step': 17},\n",
              "  {'loss': 1.554183006286621, 'step': 18},\n",
              "  {'loss': 3.3156235218048096, 'step': 19},\n",
              "  {'loss': 0.5057074427604675, 'step': 20},\n",
              "  {'loss': 1.4255319833755493, 'step': 21},\n",
              "  {'loss': 1.7925046682357788, 'step': 22},\n",
              "  {'loss': 0.7394453883171082, 'step': 23},\n",
              "  {'loss': 2.46834659576416, 'step': 24},\n",
              "  {'loss': 0.5091009736061096, 'step': 25},\n",
              "  {'loss': 0.727333128452301, 'step': 26},\n",
              "  {'loss': 0.8963626027107239, 'step': 27},\n",
              "  {'loss': 1.2216694355010986, 'step': 28},\n",
              "  {'loss': 0.4548407793045044, 'step': 29},\n",
              "  {'loss': 1.2742788791656494, 'step': 30},\n",
              "  {'loss': 0.9650290608406067, 'step': 31},\n",
              "  {'loss': 0.7726976871490479, 'step': 32},\n",
              "  {'loss': 0.8358648419380188, 'step': 33},\n",
              "  {'loss': 0.6290854215621948, 'step': 34},\n",
              "  {'loss': 0.8181953430175781, 'step': 35},\n",
              "  {'loss': 1.432931661605835, 'step': 36},\n",
              "  {'loss': 0.8582264184951782, 'step': 37},\n",
              "  {'loss': 0.424399197101593, 'step': 38},\n",
              "  {'loss': 0.6330285668373108, 'step': 39},\n",
              "  {'loss': 1.9274284839630127, 'step': 40},\n",
              "  {'loss': 1.3061373233795166, 'step': 41},\n",
              "  {'loss': 2.1005215644836426, 'step': 42},\n",
              "  {'loss': 1.2410430908203125, 'step': 43},\n",
              "  {'loss': 1.4106805324554443, 'step': 44},\n",
              "  {'loss': 0.6911019086837769, 'step': 45},\n",
              "  {'loss': 0.45829665660858154, 'step': 46},\n",
              "  {'loss': 0.6350002884864807, 'step': 47},\n",
              "  {'loss': 0.32074350118637085, 'step': 48},\n",
              "  {'loss': 0.46390655636787415, 'step': 49},\n",
              "  {'loss': 0.7932970523834229, 'step': 50},\n",
              "  {'loss': 0.3365709185600281, 'step': 51},\n",
              "  {'loss': 0.9150164127349854, 'step': 52},\n",
              "  {'loss': 0.9764479398727417, 'step': 53},\n",
              "  {'loss': 0.5752023458480835, 'step': 54},\n",
              "  {'loss': 0.8124412894248962, 'step': 55},\n",
              "  {'loss': 0.7501649856567383, 'step': 56},\n",
              "  {'loss': 0.8975092768669128, 'step': 57},\n",
              "  {'loss': 0.352799654006958, 'step': 58},\n",
              "  {'loss': 0.3458203971385956, 'step': 59},\n",
              "  {'loss': 0.9913747310638428, 'step': 60},\n",
              "  {'loss': 0.20887672901153564, 'step': 61},\n",
              "  {'loss': 0.6303591132164001, 'step': 62},\n",
              "  {'loss': 0.646214485168457, 'step': 63},\n",
              "  {'loss': 0.5268650054931641, 'step': 64},\n",
              "  {'loss': 1.0096046924591064, 'step': 65},\n",
              "  {'loss': 1.1710481643676758, 'step': 66},\n",
              "  {'loss': 0.9637565016746521, 'step': 67},\n",
              "  {'loss': 0.2571486234664917, 'step': 68},\n",
              "  {'loss': 0.566128134727478, 'step': 69},\n",
              "  {'loss': 0.9905166625976562, 'step': 70},\n",
              "  {'loss': 0.32917487621307373, 'step': 71},\n",
              "  {'loss': 0.7743517756462097, 'step': 72},\n",
              "  {'loss': 1.7246036529541016, 'step': 73},\n",
              "  {'loss': 0.46884796023368835, 'step': 74},\n",
              "  {'loss': 0.7626954913139343, 'step': 75},\n",
              "  {'loss': 1.1235690116882324, 'step': 76},\n",
              "  {'loss': 0.403367280960083, 'step': 77},\n",
              "  {'loss': 0.36131301522254944, 'step': 78},\n",
              "  {'loss': 0.6653170585632324, 'step': 79},\n",
              "  {'loss': 0.6711177229881287, 'step': 80},\n",
              "  {'loss': 0.6017429232597351, 'step': 81},\n",
              "  {'loss': 0.5018536448478699, 'step': 82},\n",
              "  {'loss': 0.872776985168457, 'step': 83},\n",
              "  {'loss': 0.8051281571388245, 'step': 84},\n",
              "  {'loss': 1.3799524307250977, 'step': 85},\n",
              "  {'loss': 0.6167190074920654, 'step': 86},\n",
              "  {'loss': 0.31002533435821533, 'step': 87},\n",
              "  {'loss': 0.7738778591156006, 'step': 88},\n",
              "  {'loss': 0.6249361038208008, 'step': 89},\n",
              "  {'loss': 0.9336500763893127, 'step': 90},\n",
              "  {'loss': 0.7607929706573486, 'step': 91},\n",
              "  {'loss': 0.3276587128639221, 'step': 92},\n",
              "  {'loss': 1.458317756652832, 'step': 93},\n",
              "  {'loss': 0.5995998382568359, 'step': 94},\n",
              "  {'loss': 0.38355475664138794, 'step': 95},\n",
              "  {'loss': 0.3592776656150818, 'step': 96},\n",
              "  {'loss': 0.2661745250225067, 'step': 97},\n",
              "  {'loss': 0.9434864521026611, 'step': 98},\n",
              "  {'loss': 1.5121707916259766, 'step': 99},\n",
              "  {'loss': 0.6338063478469849, 'step': 100},\n",
              "  {'loss': 0.4441601037979126, 'step': 101},\n",
              "  {'loss': 0.6709699630737305, 'step': 102},\n",
              "  {'loss': 0.455810546875, 'step': 103},\n",
              "  {'loss': 0.5237084627151489, 'step': 104},\n",
              "  {'loss': 0.5805379748344421, 'step': 105},\n",
              "  {'loss': 0.8914795517921448, 'step': 106},\n",
              "  {'loss': 0.5830941200256348, 'step': 107},\n",
              "  {'loss': 0.6830813884735107, 'step': 108},\n",
              "  {'loss': 0.21018056571483612, 'step': 109},\n",
              "  {'loss': 0.3228763937950134, 'step': 110},\n",
              "  {'loss': 0.9215900301933289, 'step': 111},\n",
              "  {'loss': 0.5980148911476135, 'step': 112},\n",
              "  {'loss': 2.273463726043701, 'step': 113},\n",
              "  {'loss': 0.29762810468673706, 'step': 114},\n",
              "  {'loss': 1.9156872034072876, 'step': 115},\n",
              "  {'loss': 0.9788106679916382, 'step': 116},\n",
              "  {'loss': 0.6560214757919312, 'step': 117},\n",
              "  {'loss': 0.44786205887794495, 'step': 118},\n",
              "  {'loss': 0.8992222547531128, 'step': 119},\n",
              "  {'loss': 1.0203940868377686, 'step': 120},\n",
              "  {'loss': 0.22752463817596436, 'step': 121},\n",
              "  {'loss': 0.7915818691253662, 'step': 122},\n",
              "  {'loss': 0.44838911294937134, 'step': 123},\n",
              "  {'loss': 0.42598602175712585, 'step': 124},\n",
              "  {'loss': 0.6460056304931641, 'step': 125},\n",
              "  {'loss': 0.4131121039390564, 'step': 126},\n",
              "  {'loss': 1.6077697277069092, 'step': 127},\n",
              "  {'loss': 0.7061275243759155, 'step': 128},\n",
              "  {'loss': 0.3451239764690399, 'step': 129},\n",
              "  {'loss': 0.36624833941459656, 'step': 130},\n",
              "  {'loss': 0.29524993896484375, 'step': 131},\n",
              "  {'loss': 0.21971841156482697, 'step': 132},\n",
              "  {'loss': 0.2788863182067871, 'step': 133},\n",
              "  {'loss': 1.286092758178711, 'step': 134},\n",
              "  {'loss': 0.4095834493637085, 'step': 135},\n",
              "  {'loss': 1.7107222080230713, 'step': 136},\n",
              "  {'loss': 0.34954380989074707, 'step': 137},\n",
              "  {'loss': 0.6475571990013123, 'step': 138},\n",
              "  {'loss': 0.20269766449928284, 'step': 139},\n",
              "  {'loss': 0.29121968150138855, 'step': 140},\n",
              "  {'loss': 0.515893816947937, 'step': 141},\n",
              "  {'loss': 0.9990786910057068, 'step': 142},\n",
              "  {'loss': 0.3374733030796051, 'step': 143},\n",
              "  {'loss': 0.6700557470321655, 'step': 144},\n",
              "  {'loss': 0.7146810293197632, 'step': 145},\n",
              "  {'loss': 0.8122270703315735, 'step': 146},\n",
              "  {'loss': 0.9137343168258667, 'step': 147},\n",
              "  {'loss': 0.5608561038970947, 'step': 148},\n",
              "  {'loss': 0.5691163539886475, 'step': 149},\n",
              "  {'loss': 0.7196381688117981, 'step': 150},\n",
              "  {'loss': 0.41140618920326233, 'step': 151},\n",
              "  {'loss': 0.9518729448318481, 'step': 152},\n",
              "  {'loss': 0.9725977182388306, 'step': 153},\n",
              "  {'loss': 0.2882973551750183, 'step': 154},\n",
              "  {'loss': 0.44390666484832764, 'step': 155},\n",
              "  {'loss': 1.0509777069091797, 'step': 156},\n",
              "  {'loss': 0.9915628433227539, 'step': 157},\n",
              "  {'loss': 0.22247672080993652, 'step': 158},\n",
              "  {'loss': 1.7350471019744873, 'step': 159},\n",
              "  {'loss': 0.9977527856826782, 'step': 160},\n",
              "  {'loss': 0.30255424976348877, 'step': 161},\n",
              "  {'loss': 0.3603721857070923, 'step': 162},\n",
              "  {'loss': 1.049312710762024, 'step': 163},\n",
              "  {'loss': 0.7432567477226257, 'step': 164},\n",
              "  {'loss': 1.6002320051193237, 'step': 165},\n",
              "  {'loss': 0.4574406147003174, 'step': 166},\n",
              "  {'loss': 0.35290732979774475, 'step': 167},\n",
              "  {'loss': 0.23312634229660034, 'step': 168},\n",
              "  {'loss': 0.8305824995040894, 'step': 169},\n",
              "  {'loss': 0.6802408695220947, 'step': 170},\n",
              "  {'loss': 0.9746527075767517, 'step': 171},\n",
              "  {'loss': 0.33797165751457214, 'step': 172},\n",
              "  {'loss': 0.881688117980957, 'step': 173},\n",
              "  {'loss': 0.6946361660957336, 'step': 174},\n",
              "  {'loss': 0.4178243577480316, 'step': 175},\n",
              "  {'loss': 0.2948961853981018, 'step': 176},\n",
              "  {'loss': 0.6414124965667725, 'step': 177},\n",
              "  {'loss': 0.6832736730575562, 'step': 178},\n",
              "  {'loss': 0.3295589089393616, 'step': 179},\n",
              "  {'loss': 0.45361095666885376, 'step': 180},\n",
              "  {'loss': 0.4353724718093872, 'step': 181},\n",
              "  {'loss': 1.1584093570709229, 'step': 182},\n",
              "  {'loss': 0.29571887850761414, 'step': 183},\n",
              "  {'loss': 0.7757182121276855, 'step': 184},\n",
              "  {'loss': 0.6405486464500427, 'step': 185},\n",
              "  {'loss': 1.3792600631713867, 'step': 186},\n",
              "  {'loss': 0.3173731565475464, 'step': 187},\n",
              "  {'loss': 0.38240566849708557, 'step': 188},\n",
              "  {'loss': 0.9359017610549927, 'step': 189},\n",
              "  {'loss': 0.7748249173164368, 'step': 190},\n",
              "  {'loss': 0.25646281242370605, 'step': 191},\n",
              "  {'loss': 0.4899095296859741, 'step': 192},\n",
              "  {'loss': 0.28252315521240234, 'step': 193},\n",
              "  {'loss': 0.5267171263694763, 'step': 194},\n",
              "  {'loss': 0.3826252222061157, 'step': 195},\n",
              "  {'loss': 0.5328810214996338, 'step': 196},\n",
              "  {'loss': 0.26023030281066895, 'step': 197},\n",
              "  {'loss': 0.2809351086616516, 'step': 198},\n",
              "  {'loss': 0.4636024832725525, 'step': 199},\n",
              "  {'loss': 0.27659741044044495, 'step': 200},\n",
              "  {'loss': 0.34075790643692017, 'step': 201},\n",
              "  {'loss': 0.2659853398799896, 'step': 202},\n",
              "  {'loss': 0.2250606268644333, 'step': 203},\n",
              "  {'loss': 0.8712452054023743, 'step': 204},\n",
              "  {'loss': 0.3078206777572632, 'step': 205},\n",
              "  {'loss': 0.8698062896728516, 'step': 206},\n",
              "  {'loss': 0.5716188549995422, 'step': 207},\n",
              "  {'loss': 0.521410346031189, 'step': 208},\n",
              "  {'loss': 0.2536962628364563, 'step': 209},\n",
              "  {'loss': 0.3859339654445648, 'step': 210},\n",
              "  {'loss': 0.9095455408096313, 'step': 211},\n",
              "  {'loss': 0.7477130889892578, 'step': 212},\n",
              "  {'loss': 0.8572944402694702, 'step': 213},\n",
              "  {'loss': 0.28769803047180176, 'step': 214},\n",
              "  {'loss': 0.275476336479187, 'step': 215},\n",
              "  {'loss': 0.47307711839675903, 'step': 216},\n",
              "  {'loss': 0.24188023805618286, 'step': 217},\n",
              "  {'loss': 0.3710804581642151, 'step': 218},\n",
              "  {'loss': 0.5914638042449951, 'step': 219},\n",
              "  {'loss': 0.8085142970085144, 'step': 220},\n",
              "  {'loss': 0.5358320474624634, 'step': 221},\n",
              "  {'loss': 0.8300391435623169, 'step': 222},\n",
              "  {'loss': 0.4577038884162903, 'step': 223},\n",
              "  {'loss': 0.4495370090007782, 'step': 224},\n",
              "  {'loss': 0.5749555826187134, 'step': 225},\n",
              "  {'loss': 1.0288242101669312, 'step': 226},\n",
              "  {'loss': 0.39085638523101807, 'step': 227},\n",
              "  {'loss': 0.9922492504119873, 'step': 228},\n",
              "  {'loss': 0.2977951765060425, 'step': 229},\n",
              "  {'loss': 0.2442978322505951, 'step': 230},\n",
              "  {'loss': 0.4332180321216583, 'step': 231},\n",
              "  {'loss': 0.4698439836502075, 'step': 232},\n",
              "  {'loss': 0.5980256795883179, 'step': 233},\n",
              "  {'loss': 0.31951138377189636, 'step': 234},\n",
              "  {'loss': 1.2273699045181274, 'step': 235},\n",
              "  {'loss': 1.6241776943206787, 'step': 236},\n",
              "  {'loss': 0.8750923275947571, 'step': 237},\n",
              "  {'loss': 0.5130810737609863, 'step': 238},\n",
              "  {'loss': 1.181783676147461, 'step': 239},\n",
              "  {'loss': 0.2790248990058899, 'step': 240},\n",
              "  {'loss': 0.5157870054244995, 'step': 241},\n",
              "  {'loss': 1.3973721265792847, 'step': 242},\n",
              "  {'loss': 0.423011839389801, 'step': 243},\n",
              "  {'loss': 1.0957539081573486, 'step': 244},\n",
              "  {'loss': 0.5492427349090576, 'step': 245},\n",
              "  {'loss': 0.39810124039649963, 'step': 246},\n",
              "  {'loss': 0.415716290473938, 'step': 247},\n",
              "  {'loss': 0.38030654191970825, 'step': 248},\n",
              "  {'loss': 0.32190752029418945, 'step': 249},\n",
              "  {'loss': 0.2591376006603241, 'step': 250},\n",
              "  {'loss': 0.3274812400341034, 'step': 251},\n",
              "  {'loss': 0.727939784526825, 'step': 252},\n",
              "  {'loss': 0.22420230507850647, 'step': 253},\n",
              "  {'loss': 0.23004838824272156, 'step': 254},\n",
              "  {'loss': 0.9165087938308716, 'step': 255},\n",
              "  {'loss': 0.7916339635848999, 'step': 256},\n",
              "  {'loss': 0.2435421347618103, 'step': 257},\n",
              "  {'loss': 0.16322562098503113, 'step': 258},\n",
              "  {'loss': 0.32779595255851746, 'step': 259},\n",
              "  {'loss': 0.38199830055236816, 'step': 260},\n",
              "  {'loss': 0.8522869348526001, 'step': 261},\n",
              "  {'loss': 0.7698970437049866, 'step': 262},\n",
              "  {'loss': 0.39026474952697754, 'step': 263},\n",
              "  {'loss': 0.5809892416000366, 'step': 264},\n",
              "  {'loss': 0.9011263847351074, 'step': 265},\n",
              "  {'loss': 0.7270378470420837, 'step': 266},\n",
              "  {'loss': 0.1949651539325714, 'step': 267},\n",
              "  {'loss': 0.5343186855316162, 'step': 268},\n",
              "  {'loss': 0.8944262266159058, 'step': 269},\n",
              "  {'loss': 0.19659088551998138, 'step': 270},\n",
              "  {'loss': 0.39330530166625977, 'step': 271},\n",
              "  {'loss': 0.23239213228225708, 'step': 272},\n",
              "  {'loss': 0.5539470314979553, 'step': 273},\n",
              "  {'loss': 0.26093584299087524, 'step': 274},\n",
              "  {'loss': 0.2464132308959961, 'step': 275},\n",
              "  {'loss': 0.15145359933376312, 'step': 276},\n",
              "  {'loss': 0.34605592489242554, 'step': 277},\n",
              "  {'loss': 0.573549747467041, 'step': 278},\n",
              "  {'loss': 0.7096918821334839, 'step': 279},\n",
              "  {'loss': 0.4856978952884674, 'step': 280},\n",
              "  {'loss': 0.3357013761997223, 'step': 281},\n",
              "  {'loss': 0.36770132184028625, 'step': 282},\n",
              "  {'loss': 0.22071802616119385, 'step': 283},\n",
              "  {'loss': 0.6072379350662231, 'step': 284},\n",
              "  {'loss': 0.8333373069763184, 'step': 285},\n",
              "  {'loss': 0.38004663586616516, 'step': 286},\n",
              "  {'loss': 0.7110806107521057, 'step': 287},\n",
              "  {'loss': 0.7175403833389282, 'step': 288},\n",
              "  {'loss': 0.4578050971031189, 'step': 289},\n",
              "  {'loss': 0.6390380859375, 'step': 290},\n",
              "  {'loss': 0.8125389814376831, 'step': 291},\n",
              "  {'loss': 1.130537986755371, 'step': 292},\n",
              "  {'loss': 0.47300654649734497, 'step': 293},\n",
              "  {'loss': 0.2352599799633026, 'step': 294},\n",
              "  {'loss': 0.4231150150299072, 'step': 295},\n",
              "  {'loss': 0.8454254865646362, 'step': 296},\n",
              "  {'loss': 0.2456604242324829, 'step': 297},\n",
              "  {'loss': 0.3149166405200958, 'step': 298},\n",
              "  {'loss': 1.3159245252609253, 'step': 299},\n",
              "  {'loss': 0.9071311950683594, 'step': 300},\n",
              "  {'loss': 0.23927830159664154, 'step': 301},\n",
              "  {'loss': 0.6178653240203857, 'step': 302},\n",
              "  {'loss': 0.4650024175643921, 'step': 303},\n",
              "  {'loss': 0.6772271394729614, 'step': 304},\n",
              "  {'loss': 0.5010313987731934, 'step': 305},\n",
              "  {'loss': 0.5342321395874023, 'step': 306},\n",
              "  {'loss': 0.4740641713142395, 'step': 307},\n",
              "  {'loss': 0.47917288541793823, 'step': 308},\n",
              "  {'loss': 0.5211474299430847, 'step': 309},\n",
              "  {'loss': 0.33340680599212646, 'step': 310},\n",
              "  {'loss': 0.6614371538162231, 'step': 311},\n",
              "  {'loss': 1.2031707763671875, 'step': 312},\n",
              "  {'loss': 0.1906953603029251, 'step': 313},\n",
              "  {'loss': 0.43227458000183105, 'step': 314},\n",
              "  {'loss': 0.3078562021255493, 'step': 315},\n",
              "  {'loss': 0.38306888937950134, 'step': 316},\n",
              "  {'loss': 0.9292636513710022, 'step': 317},\n",
              "  {'loss': 0.9590839147567749, 'step': 318},\n",
              "  {'loss': 0.33311691880226135, 'step': 319},\n",
              "  {'loss': 9.876246452331543, 'step': 320},\n",
              "  {'loss': 0.2671089172363281, 'step': 321},\n",
              "  {'loss': 1.0683352947235107, 'step': 322},\n",
              "  {'loss': 0.539298415184021, 'step': 323},\n",
              "  {'loss': 4.467986106872559, 'step': 324},\n",
              "  {'loss': 0.8454099893569946, 'step': 325},\n",
              "  {'loss': 0.18333539366722107, 'step': 326},\n",
              "  {'loss': 0.21911828219890594, 'step': 327},\n",
              "  {'loss': 0.211613267660141, 'step': 328},\n",
              "  {'loss': 0.42056983709335327, 'step': 329},\n",
              "  {'loss': 0.6123353242874146, 'step': 330},\n",
              "  {'loss': 0.7044143676757812, 'step': 331},\n",
              "  {'loss': 0.1259632259607315, 'step': 332},\n",
              "  {'loss': 0.38600265979766846, 'step': 333},\n",
              "  {'loss': 0.4677760601043701, 'step': 334},\n",
              "  {'loss': 0.5965211391448975, 'step': 335},\n",
              "  {'loss': 0.3084580898284912, 'step': 336},\n",
              "  {'loss': 0.26176971197128296, 'step': 337},\n",
              "  {'loss': 0.38048815727233887, 'step': 338},\n",
              "  {'loss': 0.3791162967681885, 'step': 339},\n",
              "  {'loss': 0.7991820573806763, 'step': 340},\n",
              "  {'loss': 0.2792237102985382, 'step': 341},\n",
              "  {'loss': 0.3140491843223572, 'step': 342},\n",
              "  {'loss': 0.3620588183403015, 'step': 343},\n",
              "  {'loss': 0.3208633065223694, 'step': 344},\n",
              "  {'loss': 0.46010899543762207, 'step': 345},\n",
              "  {'loss': 0.34096938371658325, 'step': 346},\n",
              "  {'loss': 0.34351032972335815, 'step': 347},\n",
              "  {'loss': 0.9891068935394287, 'step': 348},\n",
              "  {'loss': 0.40459853410720825, 'step': 349},\n",
              "  {'loss': 0.47499778866767883, 'step': 350},\n",
              "  {'loss': 0.41492074728012085, 'step': 351},\n",
              "  {'loss': 0.5665103197097778, 'step': 352},\n",
              "  {'loss': 0.21107813715934753, 'step': 353},\n",
              "  {'loss': 0.18979153037071228, 'step': 354},\n",
              "  {'loss': 0.35527297854423523, 'step': 355},\n",
              "  {'loss': 0.3700920343399048, 'step': 356},\n",
              "  {'loss': 1.2855645418167114, 'step': 357},\n",
              "  {'loss': 0.26497769355773926, 'step': 358},\n",
              "  {'loss': 0.4905593991279602, 'step': 359},\n",
              "  {'loss': 0.5721384286880493, 'step': 360},\n",
              "  {'loss': 0.28722068667411804, 'step': 361},\n",
              "  {'loss': 0.31772205233573914, 'step': 362},\n",
              "  {'loss': 0.24726060032844543, 'step': 363},\n",
              "  {'loss': 0.6402182579040527, 'step': 364},\n",
              "  {'loss': 0.5367029905319214, 'step': 365},\n",
              "  {'loss': 0.6889568567276001, 'step': 366},\n",
              "  {'loss': 1.81728994846344, 'step': 367},\n",
              "  {'loss': 0.31575727462768555, 'step': 368},\n",
              "  {'loss': 0.7929819226264954, 'step': 369},\n",
              "  {'loss': 0.31310880184173584, 'step': 370},\n",
              "  {'loss': 0.6251080632209778, 'step': 371},\n",
              "  {'loss': 0.5396559238433838, 'step': 372},\n",
              "  {'loss': 0.4173300266265869, 'step': 373},\n",
              "  {'loss': 0.8930375576019287, 'step': 374},\n",
              "  {'loss': 0.6851896643638611, 'step': 375},\n",
              "  {'loss': 0.27097123861312866, 'step': 376},\n",
              "  {'loss': 0.2815111577510834, 'step': 377},\n",
              "  {'loss': 0.7999331951141357, 'step': 378},\n",
              "  {'loss': 0.31046262383461, 'step': 379},\n",
              "  {'loss': 0.6961192488670349, 'step': 380},\n",
              "  {'loss': 0.39427074790000916, 'step': 381},\n",
              "  {'loss': 0.14043021202087402, 'step': 382},\n",
              "  {'loss': 0.4081565737724304, 'step': 383},\n",
              "  {'loss': 0.3635319173336029, 'step': 384},\n",
              "  {'loss': 0.44153690338134766, 'step': 385},\n",
              "  {'loss': 0.3585728406906128, 'step': 386},\n",
              "  {'loss': 0.2078780233860016, 'step': 387},\n",
              "  {'loss': 0.20101413130760193, 'step': 388},\n",
              "  {'loss': 0.41071823239326477, 'step': 389},\n",
              "  {'loss': 0.24900661408901215, 'step': 390},\n",
              "  {'loss': 0.47617650032043457, 'step': 391},\n",
              "  {'loss': 1.1082574129104614, 'step': 392},\n",
              "  {'loss': 0.3245701789855957, 'step': 393},\n",
              "  {'loss': 0.5346361398696899, 'step': 394},\n",
              "  {'loss': 0.16318878531455994, 'step': 395},\n",
              "  {'loss': 0.6229051351547241, 'step': 396},\n",
              "  {'loss': 0.5119749307632446, 'step': 397},\n",
              "  {'loss': 0.5354165434837341, 'step': 398},\n",
              "  {'loss': 0.640971839427948, 'step': 399},\n",
              "  {'loss': 0.7883087396621704, 'step': 400},\n",
              "  {'loss': 0.4619638919830322, 'step': 401},\n",
              "  {'loss': 0.6635213494300842, 'step': 402},\n",
              "  {'loss': 1.215920090675354, 'step': 403},\n",
              "  {'loss': 0.76520836353302, 'step': 404},\n",
              "  {'loss': 0.6435906887054443, 'step': 405},\n",
              "  {'loss': 0.3707321286201477, 'step': 406},\n",
              "  {'loss': 0.6011044979095459, 'step': 407},\n",
              "  {'loss': 0.29271000623703003, 'step': 408},\n",
              "  {'loss': 0.2933822274208069, 'step': 409},\n",
              "  {'loss': 0.17024445533752441, 'step': 410},\n",
              "  {'loss': 0.18704688549041748, 'step': 411},\n",
              "  {'loss': 0.3008140027523041, 'step': 412},\n",
              "  {'loss': 0.4955332279205322, 'step': 413},\n",
              "  {'loss': 0.2273188978433609, 'step': 414},\n",
              "  {'loss': 1.0389193296432495, 'step': 415},\n",
              "  {'loss': 0.44897380471229553, 'step': 416},\n",
              "  {'loss': 0.32890287041664124, 'step': 417},\n",
              "  {'loss': 0.4792402684688568, 'step': 418},\n",
              "  {'loss': 0.1797061264514923, 'step': 419},\n",
              "  {'loss': 0.7336180210113525, 'step': 420},\n",
              "  {'loss': 0.21489621698856354, 'step': 421},\n",
              "  {'loss': 0.23003077507019043, 'step': 422},\n",
              "  {'loss': 0.28756630420684814, 'step': 423},\n",
              "  {'loss': 0.2955729365348816, 'step': 424},\n",
              "  {'loss': 0.6634539365768433, 'step': 425},\n",
              "  {'loss': 0.7343536019325256, 'step': 426},\n",
              "  {'loss': 0.4505259394645691, 'step': 427},\n",
              "  {'loss': 0.4620768427848816, 'step': 428},\n",
              "  {'loss': 0.27603596448898315, 'step': 429},\n",
              "  {'loss': 0.15067419409751892, 'step': 430},\n",
              "  {'loss': 0.4922005236148834, 'step': 431},\n",
              "  {'loss': 0.7175613641738892, 'step': 432},\n",
              "  {'loss': 0.41671228408813477, 'step': 433},\n",
              "  {'loss': 0.31652379035949707, 'step': 434},\n",
              "  {'loss': 0.5738663673400879, 'step': 435},\n",
              "  {'loss': 0.6707255244255066, 'step': 436},\n",
              "  {'loss': 0.2994593381881714, 'step': 437},\n",
              "  {'loss': 0.4020381569862366, 'step': 438},\n",
              "  {'loss': 0.534538209438324, 'step': 439},\n",
              "  {'loss': 0.25845539569854736, 'step': 440},\n",
              "  {'loss': 0.6432316303253174, 'step': 441},\n",
              "  {'loss': 0.3964517116546631, 'step': 442},\n",
              "  {'loss': 1.0761393308639526, 'step': 443},\n",
              "  {'loss': 0.8176558613777161, 'step': 444},\n",
              "  {'loss': 0.426779568195343, 'step': 445},\n",
              "  {'loss': 0.48492828011512756, 'step': 446},\n",
              "  {'loss': 0.8002322912216187, 'step': 447},\n",
              "  {'loss': 0.5411409735679626, 'step': 448},\n",
              "  {'loss': 0.6004080772399902, 'step': 449},\n",
              "  {'loss': 0.2384224832057953, 'step': 450},\n",
              "  {'loss': 0.5624421238899231, 'step': 451},\n",
              "  {'loss': 0.33230260014533997, 'step': 452},\n",
              "  {'loss': 0.26826685667037964, 'step': 453},\n",
              "  {'loss': 0.3624107241630554, 'step': 454},\n",
              "  {'loss': 0.5675255060195923, 'step': 455},\n",
              "  {'loss': 0.41517192125320435, 'step': 456},\n",
              "  {'loss': 0.1553536206483841, 'step': 457},\n",
              "  {'loss': 1.814592957496643, 'step': 458},\n",
              "  {'loss': 0.2587372958660126, 'step': 459},\n",
              "  {'loss': 0.214511901140213, 'step': 460},\n",
              "  {'loss': 0.15719550848007202, 'step': 461},\n",
              "  {'loss': 0.5127476453781128, 'step': 462},\n",
              "  {'loss': 0.4904519319534302, 'step': 463},\n",
              "  {'loss': 0.35087937116622925, 'step': 464},\n",
              "  {'loss': 0.2873164713382721, 'step': 465},\n",
              "  {'loss': 0.23355232179164886, 'step': 466},\n",
              "  {'loss': 0.476158082485199, 'step': 467},\n",
              "  {'loss': 1.988410234451294, 'step': 468},\n",
              "  {'loss': 1.109267234802246, 'step': 469},\n",
              "  {'loss': 0.2687346935272217, 'step': 470},\n",
              "  {'loss': 0.8002889156341553, 'step': 471},\n",
              "  {'loss': 0.2381114661693573, 'step': 472},\n",
              "  {'loss': 0.29744797945022583, 'step': 473},\n",
              "  {'loss': 0.5561131238937378, 'step': 474},\n",
              "  {'loss': 0.4848672151565552, 'step': 475},\n",
              "  {'loss': 0.46829575300216675, 'step': 476},\n",
              "  {'loss': 0.8572866916656494, 'step': 477},\n",
              "  {'loss': 0.43578192591667175, 'step': 478},\n",
              "  {'loss': 0.5337732434272766, 'step': 479},\n",
              "  {'loss': 0.5474274158477783, 'step': 480},\n",
              "  {'loss': 0.6153956651687622, 'step': 481},\n",
              "  {'loss': 0.3226779103279114, 'step': 482},\n",
              "  {'loss': 0.2058294117450714, 'step': 483},\n",
              "  {'loss': 0.3386476933956146, 'step': 484},\n",
              "  {'loss': 0.42970147728919983, 'step': 485},\n",
              "  {'loss': 0.786202609539032, 'step': 486},\n",
              "  {'loss': 0.5840679407119751, 'step': 487},\n",
              "  {'loss': 1.1124098300933838, 'step': 488},\n",
              "  {'loss': 0.3260638117790222, 'step': 489},\n",
              "  {'loss': 0.4634334444999695, 'step': 490},\n",
              "  {'loss': 0.7005872130393982, 'step': 491},\n",
              "  {'loss': 0.3447958827018738, 'step': 492},\n",
              "  {'loss': 0.5834927558898926, 'step': 493},\n",
              "  {'loss': 1.1751248836517334, 'step': 494},\n",
              "  {'loss': 0.09231675416231155, 'step': 495},\n",
              "  {'loss': 0.20801252126693726, 'step': 496},\n",
              "  {'loss': 0.8327540755271912, 'step': 497},\n",
              "  {'loss': 0.42553919553756714, 'step': 498},\n",
              "  {'loss': 0.2086837887763977, 'step': 499},\n",
              "  {'loss': 0.7908880710601807, 'step': 500},\n",
              "  {'loss': 0.3646215796470642, 'step': 501},\n",
              "  {'loss': 0.598537266254425, 'step': 502},\n",
              "  {'loss': 0.4674551784992218, 'step': 503},\n",
              "  {'loss': 0.9087173938751221, 'step': 504},\n",
              "  {'loss': 0.7034216523170471, 'step': 505},\n",
              "  {'loss': 0.6914204359054565, 'step': 506},\n",
              "  {'loss': 0.3898083567619324, 'step': 507},\n",
              "  {'loss': 0.554473876953125, 'step': 508},\n",
              "  {'loss': 0.3755931258201599, 'step': 509},\n",
              "  {'loss': 0.2588638961315155, 'step': 510},\n",
              "  {'loss': 0.4297368824481964, 'step': 511},\n",
              "  {'loss': 0.21456024050712585, 'step': 512},\n",
              "  {'loss': 0.2579570412635803, 'step': 513},\n",
              "  {'loss': 0.16466102004051208, 'step': 514},\n",
              "  {'loss': 0.16072387993335724, 'step': 515},\n",
              "  {'loss': 0.44524654746055603, 'step': 516},\n",
              "  {'loss': 0.26991844177246094, 'step': 517},\n",
              "  {'loss': 0.0818205326795578, 'step': 518},\n",
              "  {'loss': 0.5263387560844421, 'step': 519},\n",
              "  {'loss': 0.563364565372467, 'step': 520},\n",
              "  {'loss': 0.5412924885749817, 'step': 521},\n",
              "  {'loss': 0.46860021352767944, 'step': 522},\n",
              "  {'loss': 0.7488759756088257, 'step': 523},\n",
              "  {'loss': 0.46903079748153687, 'step': 524},\n",
              "  {'loss': 0.2793131470680237, 'step': 525},\n",
              "  {'loss': 0.18371936678886414, 'step': 526},\n",
              "  {'loss': 0.39573124051094055, 'step': 527},\n",
              "  {'loss': 0.7310997247695923, 'step': 528},\n",
              "  {'loss': 0.4472847580909729, 'step': 529},\n",
              "  {'loss': 0.2508566975593567, 'step': 530},\n",
              "  {'loss': 0.42912590503692627, 'step': 531},\n",
              "  {'loss': 0.4178471863269806, 'step': 532},\n",
              "  {'loss': 0.668114185333252, 'step': 533},\n",
              "  {'loss': 0.26272761821746826, 'step': 534},\n",
              "  {'loss': 0.23881018161773682, 'step': 535},\n",
              "  {'loss': 0.4507920444011688, 'step': 536},\n",
              "  {'loss': 0.29213082790374756, 'step': 537},\n",
              "  {'loss': 0.6607736945152283, 'step': 538},\n",
              "  {'loss': 0.8000389933586121, 'step': 539},\n",
              "  {'loss': 0.19061143696308136, 'step': 540},\n",
              "  {'loss': 0.10294628888368607, 'step': 541},\n",
              "  {'loss': 0.594120979309082, 'step': 542},\n",
              "  {'loss': 0.2676411271095276, 'step': 543},\n",
              "  {'loss': 0.6153876781463623, 'step': 544},\n",
              "  {'loss': 0.36362332105636597, 'step': 545},\n",
              "  {'loss': 0.28134387731552124, 'step': 546},\n",
              "  {'loss': 0.2771962881088257, 'step': 547},\n",
              "  {'loss': 1.0481165647506714, 'step': 548},\n",
              "  {'loss': 0.2896348237991333, 'step': 549},\n",
              "  {'loss': 2.1628429889678955, 'step': 550},\n",
              "  {'loss': 0.2930956780910492, 'step': 551},\n",
              "  {'loss': 0.3255482017993927, 'step': 552},\n",
              "  {'loss': 0.4359325170516968, 'step': 553},\n",
              "  {'loss': 0.681833803653717, 'step': 554},\n",
              "  {'loss': 0.34646522998809814, 'step': 555},\n",
              "  {'loss': 0.5959542989730835, 'step': 556},\n",
              "  {'loss': 0.3359495997428894, 'step': 557},\n",
              "  {'loss': 0.7789100408554077, 'step': 558},\n",
              "  {'loss': 0.6807864308357239, 'step': 559},\n",
              "  {'loss': 0.5371174812316895, 'step': 560},\n",
              "  {'loss': 0.17181158065795898, 'step': 561},\n",
              "  {'loss': 0.7075058817863464, 'step': 562},\n",
              "  {'loss': 0.5441857576370239, 'step': 563},\n",
              "  {'loss': 0.7063230276107788, 'step': 564},\n",
              "  {'loss': 1.189253568649292, 'step': 565},\n",
              "  {'loss': 0.521964430809021, 'step': 566},\n",
              "  {'loss': 0.2725008726119995, 'step': 567},\n",
              "  {'loss': 0.39347970485687256, 'step': 568},\n",
              "  {'loss': 1.0275001525878906, 'step': 569},\n",
              "  {'loss': 0.2805999219417572, 'step': 570},\n",
              "  {'loss': 0.29727983474731445, 'step': 571},\n",
              "  {'loss': 0.4509626030921936, 'step': 572},\n",
              "  {'loss': 0.1659488081932068, 'step': 573},\n",
              "  {'loss': 0.2636604309082031, 'step': 574},\n",
              "  {'loss': 0.40421611070632935, 'step': 575},\n",
              "  {'loss': 0.7772597074508667, 'step': 576},\n",
              "  {'loss': 0.38002657890319824, 'step': 577},\n",
              "  {'loss': 0.3243771493434906, 'step': 578},\n",
              "  {'loss': 0.2316361367702484, 'step': 579},\n",
              "  {'loss': 0.3934006690979004, 'step': 580},\n",
              "  {'loss': 0.41397473216056824, 'step': 581},\n",
              "  {'loss': 1.0944238901138306, 'step': 582},\n",
              "  {'loss': 0.41135111451148987, 'step': 583},\n",
              "  {'loss': 0.34855949878692627, 'step': 584},\n",
              "  {'loss': 0.6888476014137268, 'step': 585},\n",
              "  {'loss': 0.32349061965942383, 'step': 586},\n",
              "  {'loss': 0.5740337371826172, 'step': 587},\n",
              "  {'loss': 0.9312728643417358, 'step': 588},\n",
              "  {'loss': 1.252579689025879, 'step': 589},\n",
              "  {'loss': 0.4200875759124756, 'step': 590},\n",
              "  {'loss': 0.9142563939094543, 'step': 591},\n",
              "  {'loss': 0.1392734944820404, 'step': 592},\n",
              "  {'loss': 0.27330225706100464, 'step': 593},\n",
              "  {'loss': 0.6614862680435181, 'step': 594},\n",
              "  {'loss': 0.48043951392173767, 'step': 595},\n",
              "  {'loss': 0.2336011826992035, 'step': 596},\n",
              "  {'loss': 0.24685253202915192, 'step': 597},\n",
              "  {'loss': 0.5024938583374023, 'step': 598},\n",
              "  {'loss': 0.22720113396644592, 'step': 599},\n",
              "  {'loss': 0.6177334785461426, 'step': 600},\n",
              "  {'loss': 0.4695935845375061, 'step': 601},\n",
              "  {'loss': 0.3716616928577423, 'step': 602},\n",
              "  {'loss': 0.567585289478302, 'step': 603},\n",
              "  {'loss': 0.9483274221420288, 'step': 604},\n",
              "  {'loss': 0.255023717880249, 'step': 605},\n",
              "  {'loss': 0.17723160982131958, 'step': 606},\n",
              "  {'loss': 0.6173114776611328, 'step': 607},\n",
              "  {'loss': 0.5659846067428589, 'step': 608},\n",
              "  {'loss': 0.3029971718788147, 'step': 609},\n",
              "  {'loss': 0.42584457993507385, 'step': 610},\n",
              "  {'loss': 0.6866897940635681, 'step': 611},\n",
              "  {'loss': 2.8696634769439697, 'step': 612},\n",
              "  {'loss': 0.5358257293701172, 'step': 613},\n",
              "  {'loss': 0.552876353263855, 'step': 614},\n",
              "  {'loss': 0.8917794823646545, 'step': 615},\n",
              "  {'loss': 0.6239140629768372, 'step': 616},\n",
              "  {'loss': 0.7555249333381653, 'step': 617},\n",
              "  {'loss': 0.5217965245246887, 'step': 618},\n",
              "  {'loss': 0.376743346452713, 'step': 619},\n",
              "  {'loss': 1.0365513563156128, 'step': 620},\n",
              "  {'loss': 0.2652174234390259, 'step': 621},\n",
              "  {'loss': 0.6764177680015564, 'step': 622},\n",
              "  {'loss': 0.38828420639038086, 'step': 623},\n",
              "  {'loss': 0.42943528294563293, 'step': 624},\n",
              "  {'loss': 0.4518013596534729, 'step': 625},\n",
              "  {'loss': 0.5667626261711121, 'step': 626},\n",
              "  {'loss': 0.39986032247543335, 'step': 627},\n",
              "  {'loss': 1.2456674575805664, 'step': 628},\n",
              "  {'loss': 0.4235839247703552, 'step': 629},\n",
              "  {'loss': 0.30269086360931396, 'step': 630},\n",
              "  {'loss': 0.2693503499031067, 'step': 631},\n",
              "  {'loss': 0.22673484683036804, 'step': 632},\n",
              "  {'loss': 0.37698298692703247, 'step': 633},\n",
              "  {'loss': 0.2498946338891983, 'step': 634},\n",
              "  {'loss': 0.5360912084579468, 'step': 635},\n",
              "  {'loss': 0.7149734497070312, 'step': 636},\n",
              "  {'loss': 0.2346084713935852, 'step': 637},\n",
              "  {'loss': 0.5061081647872925, 'step': 638},\n",
              "  {'loss': 0.560866117477417, 'step': 639},\n",
              "  {'loss': 0.4012755751609802, 'step': 640},\n",
              "  {'loss': 0.569427490234375, 'step': 641},\n",
              "  {'loss': 0.19892558455467224, 'step': 642},\n",
              "  {'loss': 0.8106005191802979, 'step': 643},\n",
              "  {'loss': 0.25604796409606934, 'step': 644},\n",
              "  {'loss': 0.17552101612091064, 'step': 645},\n",
              "  {'loss': 0.6650674343109131, 'step': 646},\n",
              "  {'loss': 0.5187727212905884, 'step': 647},\n",
              "  {'loss': 1.168386697769165, 'step': 648},\n",
              "  {'loss': 0.6575507521629333, 'step': 649},\n",
              "  {'loss': 0.36055484414100647, 'step': 650},\n",
              "  {'loss': 0.10933835059404373, 'step': 651},\n",
              "  {'loss': 0.2072070837020874, 'step': 652},\n",
              "  {'loss': 0.12628096342086792, 'step': 653},\n",
              "  {'loss': 0.24723342061042786, 'step': 654},\n",
              "  {'loss': 0.6216523051261902, 'step': 655},\n",
              "  {'loss': 0.6989150643348694, 'step': 656},\n",
              "  {'loss': 0.4398423433303833, 'step': 657},\n",
              "  {'loss': 0.20095796883106232, 'step': 658},\n",
              "  {'loss': 1.3092169761657715, 'step': 659},\n",
              "  {'loss': 0.35711365938186646, 'step': 660},\n",
              "  {'loss': 0.5229068398475647, 'step': 661},\n",
              "  {'loss': 0.2197248339653015, 'step': 662},\n",
              "  {'loss': 0.5246728658676147, 'step': 663},\n",
              "  {'loss': 0.47261369228363037, 'step': 664},\n",
              "  {'loss': 0.7067042589187622, 'step': 665},\n",
              "  {'loss': 0.8187228441238403, 'step': 666},\n",
              "  {'loss': 0.48435771465301514, 'step': 667},\n",
              "  {'loss': 0.210514634847641, 'step': 668},\n",
              "  {'loss': 0.37656158208847046, 'step': 669},\n",
              "  {'loss': 0.4057517349720001, 'step': 670},\n",
              "  {'loss': 0.2874445915222168, 'step': 671},\n",
              "  {'loss': 0.3303152322769165, 'step': 672},\n",
              "  {'loss': 0.27473992109298706, 'step': 673},\n",
              "  {'loss': 0.36948496103286743, 'step': 674},\n",
              "  {'loss': 0.3980776071548462, 'step': 675},\n",
              "  {'loss': 0.1365860402584076, 'step': 676},\n",
              "  {'loss': 0.8205289244651794, 'step': 677},\n",
              "  {'loss': 0.7424432039260864, 'step': 678},\n",
              "  {'loss': 0.6363147497177124, 'step': 679},\n",
              "  {'loss': 0.4198357164859772, 'step': 680},\n",
              "  {'loss': 0.7253216505050659, 'step': 681},\n",
              "  {'loss': 0.5498286485671997, 'step': 682},\n",
              "  {'loss': 0.565781831741333, 'step': 683},\n",
              "  {'loss': 0.16683819890022278, 'step': 684},\n",
              "  {'loss': 0.3196119964122772, 'step': 685},\n",
              "  {'loss': 0.19738700985908508, 'step': 686},\n",
              "  {'loss': 0.3043219745159149, 'step': 687},\n",
              "  {'loss': 0.3180793523788452, 'step': 688},\n",
              "  {'loss': 0.6038267016410828, 'step': 689},\n",
              "  {'loss': 0.22624695301055908, 'step': 690},\n",
              "  {'loss': 0.956154465675354, 'step': 691},\n",
              "  {'loss': 0.3038654625415802, 'step': 692},\n",
              "  {'loss': 0.2860354781150818, 'step': 693},\n",
              "  {'loss': 0.4831392765045166, 'step': 694},\n",
              "  {'loss': 0.5340351462364197, 'step': 695},\n",
              "  {'loss': 0.4033786654472351, 'step': 696},\n",
              "  {'loss': 0.3323422968387604, 'step': 697},\n",
              "  {'loss': 7.01339054107666, 'step': 698},\n",
              "  {'loss': 0.2271755486726761, 'step': 699},\n",
              "  {'loss': 0.7909419536590576, 'step': 700},\n",
              "  {'loss': 0.2582537531852722, 'step': 701},\n",
              "  {'loss': 0.42051178216934204, 'step': 702},\n",
              "  {'loss': 0.28942328691482544, 'step': 703},\n",
              "  {'loss': 0.5823929309844971, 'step': 704},\n",
              "  {'loss': 0.8707322478294373, 'step': 705},\n",
              "  {'loss': 0.29944559931755066, 'step': 706},\n",
              "  {'loss': 0.6760362386703491, 'step': 707},\n",
              "  {'loss': 0.7932112216949463, 'step': 708},\n",
              "  {'loss': 0.3366091251373291, 'step': 709},\n",
              "  {'loss': 0.3132925033569336, 'step': 710},\n",
              "  {'loss': 0.1709500104188919, 'step': 711},\n",
              "  {'loss': 0.7116180062294006, 'step': 712},\n",
              "  {'loss': 0.641660213470459, 'step': 713},\n",
              "  {'loss': 0.41991961002349854, 'step': 714},\n",
              "  {'loss': 0.3743036687374115, 'step': 715},\n",
              "  {'loss': 0.6756992340087891, 'step': 716},\n",
              "  {'loss': 0.8307173848152161, 'step': 717},\n",
              "  {'loss': 0.33093884587287903, 'step': 718},\n",
              "  {'loss': 0.6075260043144226, 'step': 719},\n",
              "  {'loss': 0.13590234518051147, 'step': 720},\n",
              "  {'loss': 0.4394119381904602, 'step': 721},\n",
              "  {'loss': 0.22559195756912231, 'step': 722},\n",
              "  {'loss': 0.6348403692245483, 'step': 723},\n",
              "  {'loss': 1.1428172588348389, 'step': 724},\n",
              "  {'loss': 0.2509857714176178, 'step': 725},\n",
              "  {'loss': 0.30108994245529175, 'step': 726},\n",
              "  {'loss': 0.6356955766677856, 'step': 727},\n",
              "  {'loss': 0.6026255488395691, 'step': 728},\n",
              "  {'loss': 0.31640860438346863, 'step': 729},\n",
              "  {'loss': 0.8128989934921265, 'step': 730},\n",
              "  {'loss': 0.6261342167854309, 'step': 731},\n",
              "  {'loss': 0.29734426736831665, 'step': 732},\n",
              "  {'loss': 0.6227880120277405, 'step': 733},\n",
              "  {'loss': 0.5372701287269592, 'step': 734},\n",
              "  {'loss': 0.7942442893981934, 'step': 735},\n",
              "  {'loss': 0.254226952791214, 'step': 736},\n",
              "  {'loss': 0.7706969976425171, 'step': 737},\n",
              "  {'loss': 0.24321889877319336, 'step': 738},\n",
              "  {'loss': 0.34462398290634155, 'step': 739},\n",
              "  {'loss': 0.3602278530597687, 'step': 740},\n",
              "  {'loss': 0.5281597375869751, 'step': 741},\n",
              "  {'loss': 0.39619725942611694, 'step': 742},\n",
              "  {'loss': 0.3462563753128052, 'step': 743},\n",
              "  {'loss': 0.36405184864997864, 'step': 744},\n",
              "  {'loss': 0.46759164333343506, 'step': 745},\n",
              "  {'loss': 0.3335103690624237, 'step': 746},\n",
              "  {'loss': 1.341719150543213, 'step': 747},\n",
              "  {'loss': 0.21087577939033508, 'step': 748},\n",
              "  {'loss': 0.3278195858001709, 'step': 749},\n",
              "  {'loss': 0.4432435929775238, 'step': 750},\n",
              "  {'loss': 0.26156699657440186, 'step': 751},\n",
              "  {'loss': 0.3852443993091583, 'step': 752},\n",
              "  {'loss': 0.38481855392456055, 'step': 753},\n",
              "  {'loss': 0.2985381484031677, 'step': 754},\n",
              "  {'loss': 0.20278313755989075, 'step': 755},\n",
              "  {'loss': 0.5588376522064209, 'step': 756},\n",
              "  {'loss': 0.6600813865661621, 'step': 757},\n",
              "  {'loss': 0.4077586531639099, 'step': 758},\n",
              "  {'loss': 0.27507248520851135, 'step': 759},\n",
              "  {'loss': 0.2134891003370285, 'step': 760},\n",
              "  {'loss': 0.3877265155315399, 'step': 761},\n",
              "  {'loss': 0.6551497578620911, 'step': 762},\n",
              "  {'loss': 0.20736122131347656, 'step': 763},\n",
              "  {'loss': 0.3517885208129883, 'step': 764},\n",
              "  {'loss': 0.5090904235839844, 'step': 765},\n",
              "  {'loss': 0.23294687271118164, 'step': 766},\n",
              "  {'loss': 0.2718636691570282, 'step': 767},\n",
              "  {'loss': 0.7349735498428345, 'step': 768},\n",
              "  {'loss': 0.2661714553833008, 'step': 769},\n",
              "  {'loss': 0.34480398893356323, 'step': 770},\n",
              "  {'loss': 0.18593962490558624, 'step': 771},\n",
              "  {'loss': 0.1432633399963379, 'step': 772},\n",
              "  {'loss': 0.21412181854248047, 'step': 773},\n",
              "  {'loss': 0.440154105424881, 'step': 774},\n",
              "  {'loss': 0.6594696640968323, 'step': 775},\n",
              "  {'loss': 0.5306660532951355, 'step': 776},\n",
              "  {'loss': 0.4343779385089874, 'step': 777},\n",
              "  {'loss': 0.3564110994338989, 'step': 778},\n",
              "  {'loss': 0.3998834490776062, 'step': 779},\n",
              "  {'loss': 0.5747128129005432, 'step': 780},\n",
              "  {'loss': 0.18992066383361816, 'step': 781},\n",
              "  {'loss': 0.5801107287406921, 'step': 782},\n",
              "  {'loss': 0.43954524397850037, 'step': 783},\n",
              "  {'loss': 0.509101390838623, 'step': 784},\n",
              "  {'loss': 0.5256493091583252, 'step': 785},\n",
              "  {'loss': 0.9754281044006348, 'step': 786},\n",
              "  {'loss': 0.2840350270271301, 'step': 787},\n",
              "  {'loss': 0.5053778886795044, 'step': 788},\n",
              "  {'loss': 0.4430278241634369, 'step': 789},\n",
              "  {'loss': 0.41148531436920166, 'step': 790},\n",
              "  {'loss': 0.3674342930316925, 'step': 791},\n",
              "  {'loss': 0.13619127869606018, 'step': 792},\n",
              "  {'loss': 0.5781029462814331, 'step': 793},\n",
              "  {'loss': 0.5055233240127563, 'step': 794},\n",
              "  {'loss': 0.30121049284935, 'step': 795},\n",
              "  {'loss': 0.2904180884361267, 'step': 796},\n",
              "  {'loss': 0.6152021288871765, 'step': 797},\n",
              "  {'loss': 0.3003530502319336, 'step': 798},\n",
              "  {'loss': 0.2723464071750641, 'step': 799},\n",
              "  {'loss': 0.4020720422267914, 'step': 800},\n",
              "  {'loss': 0.7625736594200134, 'step': 801},\n",
              "  {'loss': 0.41475141048431396, 'step': 802},\n",
              "  {'loss': 0.2434886395931244, 'step': 803},\n",
              "  {'loss': 0.12446404248476028, 'step': 804},\n",
              "  {'loss': 0.22276335954666138, 'step': 805},\n",
              "  {'loss': 0.8488624095916748, 'step': 806},\n",
              "  {'loss': 0.6688861846923828, 'step': 807},\n",
              "  {'loss': 0.48850879073143005, 'step': 808},\n",
              "  {'loss': 0.7053873538970947, 'step': 809},\n",
              "  {'loss': 0.10522811114788055, 'step': 810},\n",
              "  {'loss': 0.2676284909248352, 'step': 811},\n",
              "  {'loss': 0.8628522157669067, 'step': 812},\n",
              "  {'loss': 0.22145691514015198, 'step': 813},\n",
              "  {'loss': 0.718879222869873, 'step': 814},\n",
              "  {'loss': 0.7044762969017029, 'step': 815},\n",
              "  {'loss': 0.18363161385059357, 'step': 816},\n",
              "  {'loss': 0.21919366717338562, 'step': 817},\n",
              "  {'loss': 0.3026580214500427, 'step': 818},\n",
              "  {'loss': 0.2536837160587311, 'step': 819},\n",
              "  {'loss': 0.3223946690559387, 'step': 820},\n",
              "  {'loss': 0.38653555512428284, 'step': 821},\n",
              "  {'loss': 0.7810852527618408, 'step': 822},\n",
              "  {'loss': 0.4900418519973755, 'step': 823},\n",
              "  {'loss': 0.5879995226860046, 'step': 824},\n",
              "  {'loss': 0.48703256249427795, 'step': 825},\n",
              "  {'loss': 0.3905656039714813, 'step': 826},\n",
              "  {'loss': 0.37848982214927673, 'step': 827},\n",
              "  {'loss': 0.13602705299854279, 'step': 828},\n",
              "  {'loss': 0.3884389400482178, 'step': 829},\n",
              "  {'loss': 0.3471550941467285, 'step': 830},\n",
              "  {'loss': 0.6242437958717346, 'step': 831},\n",
              "  {'loss': 0.11693108826875687, 'step': 832},\n",
              "  {'loss': 0.13415852189064026, 'step': 833},\n",
              "  {'loss': 0.36232486367225647, 'step': 834},\n",
              "  {'loss': 0.6079047918319702, 'step': 835},\n",
              "  {'loss': 0.3254154920578003, 'step': 836},\n",
              "  {'loss': 0.4606204628944397, 'step': 837},\n",
              "  {'loss': 0.14317888021469116, 'step': 838},\n",
              "  {'loss': 0.5751751065254211, 'step': 839},\n",
              "  {'loss': 0.631384015083313, 'step': 840},\n",
              "  {'loss': 0.7488004565238953, 'step': 841},\n",
              "  {'loss': 0.6086419820785522, 'step': 842},\n",
              "  {'loss': 0.7256162166595459, 'step': 843},\n",
              "  {'loss': 0.45507270097732544, 'step': 844},\n",
              "  {'loss': 0.4436108469963074, 'step': 845},\n",
              "  {'loss': 0.5141313076019287, 'step': 846},\n",
              "  {'loss': 0.3089655339717865, 'step': 847},\n",
              "  {'loss': 0.4513518810272217, 'step': 848},\n",
              "  {'loss': 0.6476455926895142, 'step': 849},\n",
              "  {'loss': 0.1817932426929474, 'step': 850},\n",
              "  {'loss': 0.7117526531219482, 'step': 851},\n",
              "  {'loss': 0.35595279932022095, 'step': 852},\n",
              "  {'loss': 0.47946977615356445, 'step': 853},\n",
              "  {'loss': 0.821352481842041, 'step': 854},\n",
              "  {'loss': 0.21626317501068115, 'step': 855},\n",
              "  {'loss': 0.25578510761260986, 'step': 856},\n",
              "  {'loss': 0.34012332558631897, 'step': 857},\n",
              "  {'loss': 0.417680561542511, 'step': 858},\n",
              "  {'loss': 0.12971633672714233, 'step': 859},\n",
              "  {'loss': 0.2989346385002136, 'step': 860},\n",
              "  {'loss': 0.4407627284526825, 'step': 861},\n",
              "  {'loss': 0.3984086513519287, 'step': 862},\n",
              "  {'loss': 0.2839913070201874, 'step': 863},\n",
              "  {'loss': 0.15623220801353455, 'step': 864},\n",
              "  {'loss': 0.10947144031524658, 'step': 865},\n",
              "  {'loss': 0.24578794836997986, 'step': 866},\n",
              "  {'loss': 0.3320278525352478, 'step': 867},\n",
              "  {'loss': 0.15444009006023407, 'step': 868},\n",
              "  {'loss': 0.3819446563720703, 'step': 869},\n",
              "  {'loss': 0.6370765566825867, 'step': 870},\n",
              "  {'loss': 0.24097737669944763, 'step': 871},\n",
              "  {'loss': 0.25284963846206665, 'step': 872},\n",
              "  {'loss': 0.3612876832485199, 'step': 873},\n",
              "  {'loss': 0.24463358521461487, 'step': 874},\n",
              "  {'loss': 0.24091608822345734, 'step': 875},\n",
              "  {'loss': 0.2641800343990326, 'step': 876},\n",
              "  {'loss': 0.44344672560691833, 'step': 877},\n",
              "  {'loss': 0.587059736251831, 'step': 878},\n",
              "  {'loss': 0.3928546905517578, 'step': 879},\n",
              "  {'loss': 0.13407352566719055, 'step': 880},\n",
              "  {'loss': 0.722787082195282, 'step': 881},\n",
              "  {'loss': 1.0059878826141357, 'step': 882},\n",
              "  {'loss': 0.9510457515716553, 'step': 883},\n",
              "  {'loss': 0.3205428123474121, 'step': 884},\n",
              "  {'loss': 0.1908615529537201, 'step': 885},\n",
              "  {'loss': 0.22787624597549438, 'step': 886},\n",
              "  {'loss': 0.5450965762138367, 'step': 887},\n",
              "  {'loss': 0.1969354897737503, 'step': 888},\n",
              "  {'loss': 0.37642085552215576, 'step': 889},\n",
              "  {'loss': 0.31345632672309875, 'step': 890},\n",
              "  {'loss': 0.24417787790298462, 'step': 891},\n",
              "  {'loss': 1.1562607288360596, 'step': 892},\n",
              "  {'loss': 0.18187180161476135, 'step': 893},\n",
              "  {'loss': 0.29846644401550293, 'step': 894},\n",
              "  {'loss': 0.4162224233150482, 'step': 895},\n",
              "  {'loss': 0.1744241714477539, 'step': 896},\n",
              "  {'loss': 0.34212279319763184, 'step': 897},\n",
              "  {'loss': 0.5114290714263916, 'step': 898},\n",
              "  {'loss': 0.5412708520889282, 'step': 899},\n",
              "  {'loss': 0.308133065700531, 'step': 900},\n",
              "  {'loss': 0.21175618469715118, 'step': 901},\n",
              "  {'loss': 0.18557675182819366, 'step': 902},\n",
              "  {'loss': 0.4470086991786957, 'step': 903},\n",
              "  {'loss': 0.9484641551971436, 'step': 904},\n",
              "  {'loss': 0.20296591520309448, 'step': 905},\n",
              "  {'loss': 0.5674722790718079, 'step': 906},\n",
              "  {'loss': 0.1473785787820816, 'step': 907},\n",
              "  {'loss': 0.4222281277179718, 'step': 908},\n",
              "  {'loss': 0.33495351672172546, 'step': 909},\n",
              "  {'loss': 0.6568677425384521, 'step': 910},\n",
              "  {'loss': 0.1528732180595398, 'step': 911},\n",
              "  {'loss': 0.29876530170440674, 'step': 912},\n",
              "  {'loss': 0.5609527826309204, 'step': 913},\n",
              "  {'loss': 0.7918629050254822, 'step': 914},\n",
              "  {'loss': 0.262655109167099, 'step': 915},\n",
              "  {'loss': 0.3011541962623596, 'step': 916},\n",
              "  {'loss': 0.7248662710189819, 'step': 917},\n",
              "  {'loss': 0.17608869075775146, 'step': 918},\n",
              "  {'loss': 0.32547521591186523, 'step': 919},\n",
              "  {'loss': 0.10629232972860336, 'step': 920},\n",
              "  {'loss': 0.6508004069328308, 'step': 921},\n",
              "  {'loss': 0.4737659990787506, 'step': 922},\n",
              "  {'loss': 0.4062041640281677, 'step': 923},\n",
              "  {'loss': 0.25311315059661865, 'step': 924},\n",
              "  {'loss': 0.5907605886459351, 'step': 925},\n",
              "  {'loss': 0.26609277725219727, 'step': 926},\n",
              "  {'loss': 0.25345444679260254, 'step': 927},\n",
              "  {'loss': 0.7426223754882812, 'step': 928},\n",
              "  {'loss': 0.3299352526664734, 'step': 929},\n",
              "  {'loss': 0.4491817355155945, 'step': 930},\n",
              "  {'loss': 0.835352897644043, 'step': 931},\n",
              "  {'loss': 0.3546280860900879, 'step': 932},\n",
              "  {'loss': 0.6224949955940247, 'step': 933},\n",
              "  {'loss': 0.6104744672775269, 'step': 934},\n",
              "  {'loss': 0.23493731021881104, 'step': 935},\n",
              "  {'loss': 0.5149123668670654, 'step': 936},\n",
              "  {'loss': 0.4355720579624176, 'step': 937},\n",
              "  {'loss': 0.6494379043579102, 'step': 938},\n",
              "  {'loss': 0.4611459970474243, 'step': 939},\n",
              "  {'loss': 0.38149604201316833, 'step': 940},\n",
              "  {'loss': 0.5076779127120972, 'step': 941},\n",
              "  {'loss': 0.5308371782302856, 'step': 942},\n",
              "  {'loss': 0.49634814262390137, 'step': 943},\n",
              "  {'loss': 0.3772261142730713, 'step': 944},\n",
              "  {'loss': 0.40501195192337036, 'step': 945},\n",
              "  {'loss': 0.45971813797950745, 'step': 946},\n",
              "  {'loss': 0.4244004487991333, 'step': 947},\n",
              "  {'loss': 0.6263414621353149, 'step': 948},\n",
              "  {'loss': 0.5470966100692749, 'step': 949},\n",
              "  {'loss': 0.43887507915496826, 'step': 950},\n",
              "  {'loss': 0.5522902011871338, 'step': 951},\n",
              "  {'loss': 0.4607975482940674, 'step': 952},\n",
              "  {'loss': 0.2531171441078186, 'step': 953},\n",
              "  {'loss': 0.24357591569423676, 'step': 954},\n",
              "  {'loss': 0.44424647092819214, 'step': 955},\n",
              "  {'loss': 0.4148525893688202, 'step': 956},\n",
              "  {'loss': 0.2777189016342163, 'step': 957},\n",
              "  {'loss': 0.30609366297721863, 'step': 958},\n",
              "  {'loss': 0.48450419306755066, 'step': 959},\n",
              "  {'loss': 0.7344051003456116, 'step': 960},\n",
              "  {'loss': 0.7689279317855835, 'step': 961},\n",
              "  {'loss': 0.5345085859298706, 'step': 962},\n",
              "  {'loss': 0.4560371935367584, 'step': 963},\n",
              "  {'loss': 0.5816037654876709, 'step': 964},\n",
              "  {'loss': 0.23572921752929688, 'step': 965},\n",
              "  {'loss': 0.693085789680481, 'step': 966},\n",
              "  {'loss': 0.44738155603408813, 'step': 967},\n",
              "  {'loss': 3.2795729637145996, 'step': 968},\n",
              "  {'loss': 0.8671324253082275, 'step': 969},\n",
              "  {'loss': 0.34374791383743286, 'step': 970},\n",
              "  {'loss': 0.12277601659297943, 'step': 971},\n",
              "  {'loss': 0.3520960509777069, 'step': 972},\n",
              "  {'loss': 0.37628549337387085, 'step': 973},\n",
              "  {'loss': 0.3953489065170288, 'step': 974},\n",
              "  {'loss': 0.27224990725517273, 'step': 975},\n",
              "  {'loss': 0.5072763562202454, 'step': 976},\n",
              "  {'loss': 1.3880001306533813, 'step': 977},\n",
              "  {'loss': 0.29361507296562195, 'step': 978},\n",
              "  {'loss': 0.2925637364387512, 'step': 979},\n",
              "  {'loss': 0.8964804410934448, 'step': 980},\n",
              "  {'loss': 0.286041259765625, 'step': 981},\n",
              "  {'loss': 0.4612976908683777, 'step': 982},\n",
              "  {'loss': 0.30415406823158264, 'step': 983},\n",
              "  {'loss': 0.2839463949203491, 'step': 984},\n",
              "  {'loss': 0.8035643100738525, 'step': 985},\n",
              "  {'loss': 0.5456683039665222, 'step': 986},\n",
              "  {'loss': 0.6638038158416748, 'step': 987},\n",
              "  {'loss': 1.121705412864685, 'step': 988},\n",
              "  {'loss': 0.45833489298820496, 'step': 989},\n",
              "  {'loss': 0.8636341094970703, 'step': 990},\n",
              "  {'loss': 0.13655082881450653, 'step': 991},\n",
              "  {'loss': 0.6451871991157532, 'step': 992},\n",
              "  {'loss': 0.23987072706222534, 'step': 993},\n",
              "  {'loss': 0.3759317398071289, 'step': 994},\n",
              "  {'loss': 0.49306443333625793, 'step': 995},\n",
              "  {'loss': 0.13303618133068085, 'step': 996},\n",
              "  {'loss': 0.09061068296432495, 'step': 997},\n",
              "  {'loss': 0.13307298719882965, 'step': 998},\n",
              "  {'loss': 0.38559776544570923, 'step': 999},\n",
              "  ...],\n",
              " 'val': [{'loss': 5.538005864324648, 'step': 0},\n",
              "  {'loss': 0.5162090283533758, 'step': 726},\n",
              "  {'loss': 0.4564349293585651, 'step': 1452},\n",
              "  {'loss': 0.4523442046455115, 'step': 2178},\n",
              "  {'loss': 0.42265965860367805, 'step': 2904},\n",
              "  {'loss': 0.40798652125907336, 'step': 3630},\n",
              "  {'loss': 0.40836782704207525, 'step': 4356},\n",
              "  {'loss': 0.4005804501535479, 'step': 5082},\n",
              "  {'loss': 0.39030541439563776, 'step': 5808},\n",
              "  {'loss': 0.38558799967416063, 'step': 6534},\n",
              "  {'loss': 0.3832253084387168, 'step': 7260},\n",
              "  {'loss': 0.4095655861964896, 'step': 7986},\n",
              "  {'loss': 0.3769740587300506, 'step': 8712},\n",
              "  {'loss': 0.37367247106615176, 'step': 9438},\n",
              "  {'loss': 0.3726778821942727, 'step': 10164},\n",
              "  {'loss': 0.37283975236918315, 'step': 10890},\n",
              "  {'loss': 0.37546926521319, 'step': 11616},\n",
              "  {'loss': 0.36339884819385926, 'step': 12342},\n",
              "  {'loss': 0.360272667409221, 'step': 13068},\n",
              "  {'loss': 0.3595178625123067, 'step': 13794},\n",
              "  {'loss': 0.36920866748887643, 'step': 14520},\n",
              "  {'loss': 0.35128317958067273, 'step': 15246},\n",
              "  {'loss': 0.35725517116856476, 'step': 15972},\n",
              "  {'loss': 0.36117578088498314, 'step': 16698},\n",
              "  {'loss': 0.3462612765325495, 'step': 17424},\n",
              "  {'loss': 0.34953736794019535, 'step': 18150},\n",
              "  {'loss': 0.3448577111602322, 'step': 18876},\n",
              "  {'loss': 0.34348265823623364, 'step': 19602},\n",
              "  {'loss': 0.3551216337152503, 'step': 20328},\n",
              "  {'loss': 0.35275132461520264, 'step': 21054},\n",
              "  {'loss': 0.3386898173157834, 'step': 21780},\n",
              "  {'loss': 0.3446185942431373, 'step': 22506},\n",
              "  {'loss': 0.3343833293919721, 'step': 23232},\n",
              "  {'loss': 0.3354599766494814, 'step': 23958},\n",
              "  {'loss': 0.33627213876355777, 'step': 24684},\n",
              "  {'loss': 0.34860097481445834, 'step': 25410},\n",
              "  {'loss': 0.3461277648683422, 'step': 26136},\n",
              "  {'loss': 0.34087285673445905, 'step': 26862},\n",
              "  {'loss': 0.3397383517162366, 'step': 27588},\n",
              "  {'loss': 0.3311087137842474, 'step': 28314},\n",
              "  {'loss': 0.3384190794727034, 'step': 29040},\n",
              "  {'loss': 0.33365375687145005, 'step': 29766},\n",
              "  {'loss': 0.34620391845333676, 'step': 30492},\n",
              "  {'loss': 0.33126865521319643, 'step': 31218},\n",
              "  {'loss': 0.33500172481063967, 'step': 31944},\n",
              "  {'loss': 0.340844388466236, 'step': 32670},\n",
              "  {'loss': 0.32508142234003246, 'step': 33396},\n",
              "  {'loss': 0.33506134885155464, 'step': 34122},\n",
              "  {'loss': 0.39305558326569473, 'step': 34848},\n",
              "  {'loss': 0.33377807516573876, 'step': 35574},\n",
              "  {'loss': 0.3473295603286136, 'step': 36300},\n",
              "  {'loss': 0.5303623168613792, 'step': 37026},\n",
              "  {'loss': 0.3376811004805663, 'step': 37752},\n",
              "  {'loss': 0.3311343962434402, 'step': 38478},\n",
              "  {'loss': 0.3552879929727267, 'step': 39204},\n",
              "  {'loss': 0.34514698614019995, 'step': 39930},\n",
              "  {'loss': 0.3319960456988043, 'step': 40656}]}"
            ]
          },
          "metadata": {},
          "execution_count": 19
        }
      ],
      "source": [
        "record"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "j-U7a2MkV51B",
        "outputId": "131f7628-6932-48b9-cd70-9cc5d1b8e0cf"
      }
    },
    {
      "cell_type": "code",
      "metadata": {
        "ExecuteTime": {
          "end_time": "2025-01-16T06:47:16.396438Z",
          "start_time": "2025-01-16T06:47:16.283630Z"
        },
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 449
        },
        "id": "4wxwMb48V51B",
        "outputId": "a0643d06-1d2f-4c10-cf23-11c9474e41a9"
      },
      "source": [
        "#画线要注意的是损失是不一定在零到1之间的\n",
        "def plot_learning_curves(record_dict, sample_step=500):\n",
        "    # build DataFrame\n",
        "    train_df = pd.DataFrame(record_dict[\"train\"]).set_index(\"step\").iloc[::sample_step]\n",
        "    val_df = pd.DataFrame(record_dict[\"val\"]).set_index(\"step\")\n",
        "\n",
        "    # plot\n",
        "    for idx, item in enumerate(train_df.columns):\n",
        "        plt.plot(train_df.index, train_df[item], label=f\"train_{item}\")\n",
        "        plt.plot(val_df.index, val_df[item], label=f\"val_{item}\")\n",
        "        plt.grid()\n",
        "        plt.legend()\n",
        "        # plt.xticks(range(0, train_df.index[-1], 10*sample_step), range(0, train_df.index[-1], 10*sample_step))\n",
        "        plt.xlabel(\"step\")\n",
        "\n",
        "        plt.show()\n",
        "\n",
        "plot_learning_curves(record)  #横坐标是 steps"
      ],
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 640x480 with 1 Axes>"
            ],
            "image/png": "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69G1a1csXry4VfqzadMmTJs2DXFxcRAEAT/++KPb5aIo4vnnn0dsbCz8/f0xbtw4nDp1yu2Y/Px8zJo1C0ajESEhIXjggQdQWlrqdsyhQ4dwzTXXwM/PD/Hx8Xj99ddrtOW7775Dz5494efnh+TkZKxcubJV+zZ79uwaj+WkSZPaRd9effVVDB06FEFBQYiKisJNN92E1NRUt2O8+Vz09Ou2Mf0bM2ZMjcdv7ty5bb5/H374Ifr16+daFGnEiBH47bffXJe358etMf1rr49bbV577TUIgoDHH3/cdV57f/zciArw9ddfizqdTvzss8/Eo0ePinPmzBFDQkLEy5cv+7ppLi+88ILYp08fMTMz03XKyclxXT537lwxPj5eXLdunbhnzx7xqquuEkeOHOm63GaziX379hXHjRsn7t+/X1y5cqUYEREhLliwwHXM2bNnRYPBID7xxBPisWPHxHfffVdUq9XiqlWrPN6flStXin/961/FZcuWiQDE5cuXu13+2muvicHBweKPP/4oHjx4ULzxxhvFTp06ieXl5a5jJk2aJPbv31/csWOHuHnzZrFr167ijBkzXJcXFRWJ0dHR4qxZs8QjR46IX331lejv7y9+/PHHrmO2bt0qqtVq8fXXXxePHTsmPvvss6JWqxUPHz7can279957xUmTJrk9lvn5+W7HtNW+TZw4Ufz888/FI0eOiAcOHBCnTJkiJiQkiKWlpa5jvPVcbI3XbWP6d+2114pz5sxxe/yKiorafP9+/vlnccWKFeLJkyfF1NRU8S9/+Yuo1WrFI0eOiKLYvh+3xvSvvT5u1e3atUtMSkoS+/XrJz722GOu89v741eVIgKLYcOGifPmzXP9brfbxbi4OPHVV1/1YavcvfDCC2L//v1rvaywsFDUarXid9995zrv+PHjIgBx+/btoihKH3YqlUrMyspyHfPhhx+KRqNRNJvNoiiK4p/+9CexT58+btd95513ihMnTvRwb9xV//B1OBxiTEyM+MYbb7jOKywsFPV6vfjVV1+JoiiKx44dEwGIu3fvdh3z22+/iYIgiBcvXhRFURQ/+OADMTQ01NU/URTFZ555RuzRo4fr9zvuuEOcOnWqW3uGDx8uPvzww63SN1GUAovp06fX+TftpW+iKIrZ2dkiAHHjxo2iKHr3ueiN1231/omi9AFV9Q29uvbUv9DQ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ndinTx9xxYoVrdY3k8kkTpgwQYyMjBS1Wq2YmJgozpkzp8aLsq32rbZ+AXB7nnjzuejp121D/UtPTxdHjx4thoWFiXq9Xuzatav49NNPu62H0Fb7d//994uJiYmiTqcTIyMjxbFjx7qCClFs349bQ/1rz49bXaoHFu398auK26YTERGRx7T7MRZERETUdjCwICIiIo9hYEFEREQew8CCiIiIPIaBBREREXkMAwsiIiLyGAYWRERE5DEMLIiIiMhjGFgQERGRxzCwIKImmT17Nm666SZfN4OI2igGFkREROQxDCyIqFbff/89kpOT4e/vj/DwcIwbNw5PP/00vvjiC/z0008QBAGCICAlJQUAkJGRgTvuuAMhISEICwvD9OnTce7cOdf1yZmORYsWITIyEkajEXPnzoXFYvFNB4moVWh83QAiansyMzMxY8YMvP7667j55ptRUlKCzZs345577kF6ejqKi4vx+eefAwDCwsJgtVoxceJEjBgxAps3b4ZGo8Hf/vY3TJo0CYcOHYJOpwMArFu3Dn5+fkhJScG5c+dw3333ITw8HC+//LIvu0tEHsTAgohqyMzMhM1mwy233ILExEQAQHJyMgDA398fZrMZMTExruP/97//weFw4NNPP4UgCACAzz//HCEhIUhJScGECRMAADqdDp999hkMBgP69OmDF198EU8//TReeuklqFRMoBIpAV/JRFRD//79MXbsWCQnJ+P222/HJ598goKCgjqPP3jwIE6fPo2goCAEBgYiMDAQYWFhqKiowJkzZ9yu12AwuH4fMWIESktLkZGR0ar9ISLvYcaCiGpQq9VYu3Yttm3bhjVr1uDdd9/FX//6V+zcubPW40tLSzF48GAsWbKkxmWRkZGt3VwiakMYWBBRrQRBwKhRozBq1Cg8//zzSExMxPLly6HT6WC3292OHTRoEL755htERUXBaDTWeZ0HDx5EeXk5/P39AQA7duxAYGAg4uPjW7UvROQ9LIUQUQ07d+7EK6+8gj179iA9PR3Lli1DTk4OevXqhaSkJBw6dAipqanIzc2F1WrFrFmzEBERgenTp2Pz5s1IS0tDSkoKHn30UVy4cMF1vRaLBQ888ACOHTuGlStX4oUXXsD8+fM5voJIQZixIKIajEYjNm3ahH/9618oLi5GYmIi/vGPf2Dy5MkYMmQIUlJSMGTIEJSWlmLDhg0YM2YMNm3ahGeeeQa33HILSkpK0KFDB4wdO9YtgzF27Fh069YNo0ePhtlsxowZM7Bw4ULfdZSIPE4QRVH0dSOISPlmz56NwsJC/Pjjj75uChG1IuYfiYiIyGMYWBAREZHHsBRCREREHsOMBREREXkMAwsiIiLyGAYWRERE5DEMLIiIiMhjGFgQERGRxzCwICIiIo9hYEFEREQew8CCiIiIPOb/A0c6kyNCqJmhAAAAAElFTkSuQmCC\n"
          },
          "metadata": {}
        }
      ],
      "execution_count": 20
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "48ipRGTmV51B"
      },
      "source": [
        "## 测试集"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "ExecuteTime": {
          "end_time": "2025-01-16T06:48:13.295991Z",
          "start_time": "2025-01-16T06:48:13.260417Z"
        },
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "Ik-UxdD3V51B",
        "outputId": "6c122d30-999a-41f9-dfd0-7593ae13fdca"
      },
      "source": [
        "model.eval()\n",
        "loss = evaluating(model, test_loader, loss_fct)\n",
        "print(f\"loss:     {loss:.4f}\")"
      ],
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "loss:     0.3300\n"
          ]
        }
      ],
      "execution_count": 21
    }
  ],
  "metadata": {
    "kernelspec": {
      "display_name": "Python 3",
      "name": "python3"
    },
    "language_info": {
      "codemirror_mode": {
        "name": "ipython",
        "version": 3
      },
      "file_extension": ".py",
      "mimetype": "text/x-python",
      "name": "python",
      "nbconvert_exporter": "python",
      "pygments_lexer": "ipython3",
      "version": "3.10.8"
    },
    "orig_nbformat": 4,
    "colab": {
      "provenance": [],
      "gpuType": "T4"
    },
    "accelerator": "GPU",
    "widgets": {
      "application/vnd.jupyter.widget-state+json": {
        "5487adfe2726479ba756489251109c5d": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HBoxModel",
          "model_module_version": "1.5.0",
          "state": {
            "_dom_classes": [],
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "HBoxModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/controls",
            "_view_module_version": "1.5.0",
            "_view_name": "HBoxView",
            "box_style": "",
            "children": [
              "IPY_MODEL_cd866417f5de463eaf2e9a227313ab11",
              "IPY_MODEL_f22eba4c5ff049888febb22e559d9e9a",
              "IPY_MODEL_14974ff782104093959e6a7900e18904"
            ],
            "layout": "IPY_MODEL_7b3002ee7c744d65aeffaacde61d9ab8"
          }
        },
        "cd866417f5de463eaf2e9a227313ab11": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HTMLModel",
          "model_module_version": "1.5.0",
          "state": {
            "_dom_classes": [],
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "HTMLModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/controls",
            "_view_module_version": "1.5.0",
            "_view_name": "HTMLView",
            "description": "",
            "description_tooltip": null,
            "layout": "IPY_MODEL_0fda42700ad64823912eb8503664e9a8",
            "placeholder": "​",
            "style": "IPY_MODEL_575b8b6c08be476684ea0475908dd5f1",
            "value": " 56%"
          }
        },
        "f22eba4c5ff049888febb22e559d9e9a": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "FloatProgressModel",
          "model_module_version": "1.5.0",
          "state": {
            "_dom_classes": [],
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "FloatProgressModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/controls",
            "_view_module_version": "1.5.0",
            "_view_name": "ProgressView",
            "bar_style": "danger",
            "description": "",
            "description_tooltip": null,
            "layout": "IPY_MODEL_4269008916704a59b2061d0780038e29",
            "max": 72600,
            "min": 0,
            "orientation": "horizontal",
            "style": "IPY_MODEL_79643440aaf148aa851a6af5c2c11901",
            "value": 40656
          }
        },
        "14974ff782104093959e6a7900e18904": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HTMLModel",
          "model_module_version": "1.5.0",
          "state": {
            "_dom_classes": [],
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "HTMLModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/controls",
            "_view_module_version": "1.5.0",
            "_view_name": "HTMLView",
            "description": "",
            "description_tooltip": null,
            "layout": "IPY_MODEL_7270709e7d20417fa9cdff57833d7f56",
            "placeholder": "​",
            "style": "IPY_MODEL_7182f0b1925044df97c5961298afcbbd",
            "value": " 40656/72600 [02:26&lt;01:30, 351.22it/s, epoch=55]"
          }
        },
        "7b3002ee7c744d65aeffaacde61d9ab8": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_model_module": "@jupyter-widgets/base",
            "_model_module_version": "1.2.0",
            "_model_name": "LayoutModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "LayoutView",
            "align_content": null,
            "align_items": null,
            "align_self": null,
            "border": null,
            "bottom": null,
            "display": null,
            "flex": null,
            "flex_flow": null,
            "grid_area": null,
            "grid_auto_columns": null,
            "grid_auto_flow": null,
            "grid_auto_rows": null,
            "grid_column": null,
            "grid_gap": null,
            "grid_row": null,
            "grid_template_areas": null,
            "grid_template_columns": null,
            "grid_template_rows": null,
            "height": null,
            "justify_content": null,
            "justify_items": null,
            "left": null,
            "margin": null,
            "max_height": null,
            "max_width": null,
            "min_height": null,
            "min_width": null,
            "object_fit": null,
            "object_position": null,
            "order": null,
            "overflow": null,
            "overflow_x": null,
            "overflow_y": null,
            "padding": null,
            "right": null,
            "top": null,
            "visibility": null,
            "width": null
          }
        },
        "0fda42700ad64823912eb8503664e9a8": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_model_module": "@jupyter-widgets/base",
            "_model_module_version": "1.2.0",
            "_model_name": "LayoutModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "LayoutView",
            "align_content": null,
            "align_items": null,
            "align_self": null,
            "border": null,
            "bottom": null,
            "display": null,
            "flex": null,
            "flex_flow": null,
            "grid_area": null,
            "grid_auto_columns": null,
            "grid_auto_flow": null,
            "grid_auto_rows": null,
            "grid_column": null,
            "grid_gap": null,
            "grid_row": null,
            "grid_template_areas": null,
            "grid_template_columns": null,
            "grid_template_rows": null,
            "height": null,
            "justify_content": null,
            "justify_items": null,
            "left": null,
            "margin": null,
            "max_height": null,
            "max_width": null,
            "min_height": null,
            "min_width": null,
            "object_fit": null,
            "object_position": null,
            "order": null,
            "overflow": null,
            "overflow_x": null,
            "overflow_y": null,
            "padding": null,
            "right": null,
            "top": null,
            "visibility": null,
            "width": null
          }
        },
        "575b8b6c08be476684ea0475908dd5f1": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "DescriptionStyleModel",
          "model_module_version": "1.5.0",
          "state": {
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "DescriptionStyleModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "StyleView",
            "description_width": ""
          }
        },
        "4269008916704a59b2061d0780038e29": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_model_module": "@jupyter-widgets/base",
            "_model_module_version": "1.2.0",
            "_model_name": "LayoutModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "LayoutView",
            "align_content": null,
            "align_items": null,
            "align_self": null,
            "border": null,
            "bottom": null,
            "display": null,
            "flex": null,
            "flex_flow": null,
            "grid_area": null,
            "grid_auto_columns": null,
            "grid_auto_flow": null,
            "grid_auto_rows": null,
            "grid_column": null,
            "grid_gap": null,
            "grid_row": null,
            "grid_template_areas": null,
            "grid_template_columns": null,
            "grid_template_rows": null,
            "height": null,
            "justify_content": null,
            "justify_items": null,
            "left": null,
            "margin": null,
            "max_height": null,
            "max_width": null,
            "min_height": null,
            "min_width": null,
            "object_fit": null,
            "object_position": null,
            "order": null,
            "overflow": null,
            "overflow_x": null,
            "overflow_y": null,
            "padding": null,
            "right": null,
            "top": null,
            "visibility": null,
            "width": null
          }
        },
        "79643440aaf148aa851a6af5c2c11901": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "ProgressStyleModel",
          "model_module_version": "1.5.0",
          "state": {
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "ProgressStyleModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "StyleView",
            "bar_color": null,
            "description_width": ""
          }
        },
        "7270709e7d20417fa9cdff57833d7f56": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_model_module": "@jupyter-widgets/base",
            "_model_module_version": "1.2.0",
            "_model_name": "LayoutModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "LayoutView",
            "align_content": null,
            "align_items": null,
            "align_self": null,
            "border": null,
            "bottom": null,
            "display": null,
            "flex": null,
            "flex_flow": null,
            "grid_area": null,
            "grid_auto_columns": null,
            "grid_auto_flow": null,
            "grid_auto_rows": null,
            "grid_column": null,
            "grid_gap": null,
            "grid_row": null,
            "grid_template_areas": null,
            "grid_template_columns": null,
            "grid_template_rows": null,
            "height": null,
            "justify_content": null,
            "justify_items": null,
            "left": null,
            "margin": null,
            "max_height": null,
            "max_width": null,
            "min_height": null,
            "min_width": null,
            "object_fit": null,
            "object_position": null,
            "order": null,
            "overflow": null,
            "overflow_x": null,
            "overflow_y": null,
            "padding": null,
            "right": null,
            "top": null,
            "visibility": null,
            "width": null
          }
        },
        "7182f0b1925044df97c5961298afcbbd": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "DescriptionStyleModel",
          "model_module_version": "1.5.0",
          "state": {
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "DescriptionStyleModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "StyleView",
            "description_width": ""
          }
        }
      }
    }
  },
  "nbformat": 4,
  "nbformat_minor": 0
}